0

我希望能够实现一种搜索方法,该方法可以将我的 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 调用后进行过滤?你会推荐什么方法?

谢谢!

4

1 回答 1

2

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

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

于 2018-12-27T08:16:46.813 回答