【问题标题】:Linq2DB arbitrary Where clauseLinq2DB 任意 Where 子句
【发布时间】:2018-12-26 22:05:39
【问题描述】:

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

谢谢!

【问题讨论】:

  • 将返回类型更改为IQueryable&lt;iUser&gt;。并删除fromselect 部分,这里没有必要。
  • 我不知道 LINQ to DB,但我很确定谓词应该是 Expression&lt;Func&lt;iUser,bool&gt;&gt;
  • 感谢@GertArnold 和@JeffArnold!这两个一起解决了我的问题。

标签: linq2db


【解决方案1】:

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

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

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

返回类型取决于你希望这个函数的调用者能够做什么。如果您返回IQueryable&lt;iUser&gt;,调用者将能够通过他们自己的表达式扩展表达式。即Search(context, somePredicate).Where(...)会整体翻译成SQL。返回 IEnumerable 将应用内存中的任何后续谓词(作为 Func 或 Expression)。

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

【讨论】:

  • 谢谢,iUser 实际上是我的 POCO 类型。我实现的接口实际上类似于“IiUserRepository”。不太好,我知道。
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-28
相关资源
最近更新 更多