Linq2DB 任意 Where 子句

Linq2DB arbitrary Where clause

我希望能够实现一种搜索方法,该方法可以将我的 POCO class 的任意属性作为参数。这很好用:

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

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

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

谢谢!

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

所以你的函数应该是这样的:

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

return 类型取决于您希望此函数的调用者能够执行的操作。如果你 return IQueryable<iUser> 调用者将能够通过他们自己的表达式扩展表达式。即Search(context, somePredicate).Where(...)会整体翻译成SQL。返回 IEnumerable 将应用内存中的任何后续谓词(作为 Func 或作为表达式)。

旁注,为了符合通用命名约定,如果 iUser 是一个接口(我不知道 LINQ to DB 是否支持接口),那么您应该将其重命名为 IUser , 否则将其命名为 User.