如何传递函数<>;在linq中用一个连接到sql

本文关键字:连接 sql 一个 lt 传递函数 gt linq | 更新日期: 2023-09-27 18:27:06

我有以下问题。

我想传递一个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();
    }

函数应该看起来像这个

    public void GetUsers ()
    {
        GetUser(50, u => u.Email.Contains("onemail@mail.com"), c=> true);
    }
    public void GetUsersFilterByClient ()
    {
        GetUser(50, u => true, c=> c.Password.Contains("MyPasssword"));
    }

如何传递函数<>;在linq中用一个连接到sql

您需要将Where lambda到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();
}

这是我创建的存储库实现的一个例子-Func方法应该足够了:

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