C# dapper将如何处理谓词?

C# dapper将如何处理谓词?,c#,dapper,C#,Dapper,如果我有一个返回狗列表的方法,Dapper是否将Where谓词转换为SQLWhere?还是先把所有的狗都弄到手,然后过滤名单 public IList<Dog> GetDogsBy(Func<Dog, bool> predicate) { return db.Query<Dog>("SELECT * FROM Dog",null).Where(predicate).ToList(); } public IList GetDogsBy(Func谓词)

如果我有一个返回狗列表的方法,
Dapper
是否将
Where
谓词转换为
SQL
Where?还是先把所有的狗都弄到手,然后过滤名单

public IList<Dog> GetDogsBy(Func<Dog, bool> predicate)
{
    return db.Query<Dog>("SELECT * FROM Dog",null).Where(predicate).ToList();
}
public IList GetDogsBy(Func谓词)
{
返回db.Query(“SELECT*FROM Dog”,null).Where(谓词).ToList();
}

当涉及到SQL分析时,虽然表达式树可以翻译,但编译的方法不能。这是因为一旦编译了该方法,就需要读取IL来执行转换,而转换不是通过.NET API公开的,而表达式树则被显式设计为使用元代码进行导航,以便进行转换

由于传递的是
Func
而不是
表达式
,因此传递的是编译后的方法,因此代码无法获取表达式树,因此上述代码将无法工作或将在本地计算机上执行

如果要将方法签名替换为

public IList<Dog> GetDogsBy(Expression<Func<Dog, bool>> predicate)
public IList GetDogsBy(表达式谓词)

然后,它可能能够执行该转换,这取决于Dapper的语义。

这取决于在解析
Where
时重载解析的作用

如果调用
查询
的结果是一个
列表
,并且您有一个
using System.Linq指令,且参数为委托,则
其中
将解析为
其中
的LINQ to objects版本。因此,select查询将在服务器上运行,然后
Where
将在客户端上运行


如果
Query
的结果是
IQueryable
,并且参数是
表达式
,则重载解析将选择与现有查询相结合的
Where
。执行该查询时,
其中
运行在查询提供程序选择运行它的任何一侧,通常是服务器。

此查询肯定会由您的应用程序执行,而不会转换为SQL。要确认;该谓词是对象的LINQ,不由dapper处理。Dapper并不声称自己是一个全重的ORM。在一些附加的相关工具中有一些常用的谓词等工具,然而,你如何考虑使用DePar扩展()呢?我很尴尬地看到你得到了一个完全正确答案的下注,其中包括了两种可能性。恰巧,dapper只返回
IEnumerable
,不尝试处理表达式树,所以您的第一个解释适用。该
IEnumerable
是否恰好是一个
列表
而不是ADO.NET读取器上的一个不完整的开放序列取决于可选的
buffered
参数。@MarcGravel:谢谢您提供的额外详细信息!