Linq2DB任意Where子句

Linq2DB任意Where子句,linq2db,Linq2db,我希望能够实现一个搜索方法,该方法可以将我的POCO类的任意属性作为参数。这很有效: public static IEnumerable<iUser> Search(DataContext context, Func<iUser, bool> predicate) { return from i in context.GetTable<iUser>().Where(predicate) select i; } 公共静态IEn

我希望能够实现一个搜索方法,该方法可以将我的POCO类的任意属性作为参数。这很有效:

 public static IEnumerable<iUser> Search(DataContext context, Func<iUser, bool> predicate)
    {
        return from i in context.GetTable<iUser>().Where(predicate) select i;
    }
公共静态IEnumerable搜索(DataContext上下文,Func谓词)
{
从context.GetTable()中的i返回。其中(谓词)选择i;
}
但在这种情况下,筛选似乎是在收集表中的所有行之后进行的

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


谢谢

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

因此,您的函数应该如下所示:

public static IEnumerable<iUser> Search(DataContext context,
    Expression<Func<iUser, bool>> predicate)
{
    return context.GetTable<iUser>().Where(predicate);
}
公共静态IEnumerable搜索(DataContext上下文,
表达式(谓词)
{
返回context.GetTable().Where(谓词);
}
返回类型取决于您希望此函数的调用方能够执行的操作。如果返回
IQueryable
,调用者将能够通过自己的表达式扩展表达式。也就是说,
Search(context,somePredicate)。其中(…)
将作为一个整体转换为SQL。返回
IEnumerable
将在内存中应用任何后续谓词(作为Func或作为表达式)


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

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

因此,您的函数应该如下所示:

public static IEnumerable<iUser> Search(DataContext context,
    Expression<Func<iUser, bool>> predicate)
{
    return context.GetTable<iUser>().Where(predicate);
}
公共静态IEnumerable搜索(DataContext上下文,
表达式(谓词)
{
返回context.GetTable().Where(谓词);
}
返回类型取决于您希望此函数的调用方能够执行的操作。如果返回
IQueryable
,调用者将能够通过自己的表达式扩展表达式。也就是说,
Search(context,somePredicate)。其中(…)
将作为一个整体转换为SQL。返回
IEnumerable
将在内存中应用任何后续谓词(作为Func或作为表达式)


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

,将返回类型更改为
IQueryable
。然后从
中删除
,然后选择
部分,这里没有必要。我不知道LINQ到DB,但我非常确定谓词应该是
表达式
。谢谢@GertArnold和@JeffArnold!两者一起解决了我的问题。将返回类型更改为
IQueryable
。然后从
中删除
,然后选择
部分,这里没有必要。我不知道LINQ到DB,但我非常确定谓词应该是
表达式
。谢谢@GertArnold和@JeffArnold!这两个一起解决了我的问题。谢谢,iUser实际上是我的POCO类型。我实现的一个接口实际上类似于“IiUserRepository”。我知道这不太好。谢谢,iUser实际上是我的POCO类型。我实现的一个接口实际上类似于“IiUserRepository”。我知道这不太好。