如果我有一个返回List of Dogs
的方法,那么Dapper
会将Where
谓词转换为SQL
其中吗?或者先把所有的狗都拿走,然后过滤清单?
public IList<Dog> GetDogsBy(Func<Dog, bool> predicate)
{
return db.Query<Dog>("SELECT * FROM Dog",null).Where(predicate).ToList();
}
答案 0 :(得分:18)
这取决于解析Where
时的重载决策。
如果调用Query
的结果是List<Dog>
并且您有using System.Linq;
指令,并且参数是委托,则Where
将解析为Where
的LINQ到对象版本。因此,select查询将在服务器上运行,然后Where
将在客户端上运行。
如果Query
的结果为IQueryable<Dog>
且参数为Expression
,则重载决策将选择与现有查询结合的Where
。执行该查询时,Where
运行在查询提供程序选择运行它的任何一侧,通常是服务器。
答案 1 :(得分:3)
对于SQL trnalsation,虽然可以翻译表达式树,但编译方法却不能。这是因为一旦编译了该方法,就需要读取IL来执行转换,而不是通过.NET API公开,而表达式树明确地设计为使用元代码进行导航以便进行转换。
因为您正在传递Func<...>
而不是Expression<Func<...>>
,所以您传递了该编译方法,因此代码无法获取表达式树,因此上面代码将无法工作或将在您的本地计算机上执行。
如果要用
替换方法签名public IList<Dog> GetDogsBy(Expression<Func<Dog, bool>> predicate)
然后它可能能够执行该转换,具体取决于Dapper的语义。