Linq2DB任意Where子句

时间:2018-12-26 22:05:40

标签: linq2db

我希望能够实现一个搜索方法,该方法可以将POCO类的任意属性用作参数。效果很好:

 public static IEnumerable<iUser> Search(DataContext context, Func<iUser, bool> predicate)
    {
        return from i in context.GetTable<iUser>().Where(predicate) select i;
    }

但是在这种情况下,过滤似乎是在收集表中的所有行之后进行的。

是否可以使用Linq生成这样的任意查询,而无需在sql调用后进行过滤?您会推荐什么方法?

谢谢!

1 个答案:

答案 0 :(得分:3)

LINQ to DB是一个对象关系映射器(ORM),它能够将LINQ表达式转换为SQL。 “表达”一词在这里很重要。 Func不是表达式而是委托,对于LINQ to DB,您必须在LINQ方法中使用Expression<Func<>>才能翻译它们。否则,将首先从数据库中提取数据,然后Func将其过滤到内存中。

因此您的函数应如下所示:

public static IEnumerable<iUser> Search(DataContext context,
    Expression<Func<iUser, bool>> predicate)
{
    return context.GetTable<iUser>().Where(predicate);
}

返回类型取决于您希望此函数的调用者能够执行的操作。如果返回IQueryable<iUser>,则调用者将可以使用自己的表达式来扩展表达式。也就是说,Search(context, somePredicate).Where(...)将整体转换为SQL。返回IEnumerable将在内存中应用所有后续谓词(作为Func或Expression)。

旁注,为了符合常见的命名约定,如果iUser是一个接口(我不知道LINQ to DB是否支持接口),则应将其重命名为IUser,否则将其命名为User