【发布时间】:2016-08-08 10:01:46
【问题描述】:
我正在尝试从 Entity Framework 转换为 Dapper,希望能提高数据访问性能。
我使用的查询是谓词的形式,例如Expression<Func<TModel, bool>>。
举个例子:
我需要使用 Dapper 转换以下代码。
我目前在做什么:
public async Task<List<TModel>> Get(Expression<Func<TModel, bool>> query)
{
// this.Context is of type DbContext
return await this.Context.Set<TModel>().Where(query).ToListAsync();
}
我想做的事:
public async Task<List<TModel>> Get(Expression<Func<TModel, bool>> query)
{
using (IDbConnection cn = this.GetConnection)
{
return await cn.QueryAsync<TModel>(query);
}
}
我的 google-fu 让我失望了,有人可以帮忙吗?
编辑:
请注意,我确实找到了: https://github.com/ryanwatson/Dapper.Extensions.Linq
但我似乎无法弄清楚如何使用它。
【问题讨论】:
-
LINQ to EF 从实体模型和 LINQ 谓词构造 SQL 语句。 Dapper 执行实际的 SQL 语句并“简单地”映射结果。您必须编写完整的 SQL 参数化 SQL 语句。
-
换一种说法,你确定你没有解决错误的问题吗?您可以简单地将又一个Where 子句添加到您的任何查询中,例如
var query=context.SomeEntity.Where()....; query=query.Where(...); query=query.Select(...);。如果您只想将过滤器添加到现有查询,则无需使用表达式。迁移到微 ORM 不会使查询的运行时构造变得更容易 -
对于 Dapper, cn.QueryAsync
(query) ,查询应该是 sql 字符串而不是 Expression >。您必须在从 EF 转换时进行重大更改。到 Dapper。
标签: c# linq expression dapper predicate