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:谢谢您提供的额外详细信息!