我希望能够实现一个搜索方法,该方法可以将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调用后进行过滤?您会推荐什么方法?
谢谢!
答案 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
。