对于谓词,小巧玲珑会做什么?

时间:2015-03-30 21:18:02

标签: c# dapper

如果我有一个返回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();
}

2 个答案:

答案 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的语义。