2012-03-08 30 views
1

我遇到以下问题。如何将linq中的func <>传递给sql加入

我想传递一个func作为参数,所以它可以在where语句中变化。

private IEnumerable<User> GetUser(int cant, Func<User, bool> userFilter, Func<Client, bool> ClientFilter) 
    { 
     return (from dcu in 
        _db.All<User>().Where(userFilter) 
       join c in _db.All<Client>() on dcu.IdClient equals c.IdClient into temp 
       from cli in temp.DefaultIfEmpty().Where(ClientFilter) 
       select new {Usuer = dcu, Client = cli}). 
      Take(cant).Select(uc => _usersMapper.Map(uc.User, uc.Client)).AsEnumerable(); 

    } 

而且FUNC应该是这样的

public void GetUsers() 
    { 
     GetUser(50, u => u.Email.Contains("[email protected]"), c=> true); 
    } 
    public void GetUsersFilterByClient() 
    { 
     GetUser(50, u => true, c=> c.Password.Contains("MyPasssword")); 
    } 
+2

您是否尝试过'Expression >'作为参数? – 2012-03-08 18:16:15

+4

'在哪里'期待一个需要1个参数并返回true的方法。在您发布的代码中,'GetUsers'不符合该要求。 – 2012-03-08 18:16:27

回答

0

这是从仓库实现我创建了一个例子 - Func键的方法就足够了:

protected override IEnumerable<ContentType> FindImpl(Func<ContentType, bool> matchPredicate) 
{ 
    return _context.ContentTypes.Where(matchPredicate); 
} 
+3

这与OP中的代码有何不同? – 2012-03-08 18:27:30

2

您需要LAMBDA你Where纳入filter功能:

private IEnumerable<User> GetUser(int cant, Func<User, bool> filter) 
{ 
    return (from dcu in _db.All<User>().Where(a => filter(a)) 
      join c in _db.All<Client>() on dcu.IdClient equals c.IdClient into temp 
      from cli in temp.DefaultIfEmpty() 
      select new {Usuer = dcu, Client = cli}). 
     Take(cant).Select(uc => _usersMapper.Map(uc.User, uc.Client)).AsEnumerable(); 
} 
相关问题