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
.
我希望能够实现一种搜索方法,该方法可以将我的 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
.