首先,Dapper的其中一位作者表示,在有人问到
是否有计划使Dapper.net与IQueryable接口兼容?
时,回答说
没有这方面的计划。这远远超出了 Dapper 尝试做的事情。我甚至会说这是相对立的。 Dapper 的核心是要成为 SQL 爱好者的朋友。
(参见https://dev59.com/XF4c5IYBdhLWcg3wv8ll#27588877)。
某种程度上,这确实表明,各种NuGet扩展包可能会像你所推荐的那样有所帮助。
我曾尝试使用DapperExtensions,它使编写程序化查询过滤器变得更加容易 - 例如:
using System.Data.SqlClient;
using DapperExtensions;
namespace StackOverflowAnswer
{
class Program
{
static void Main(string[] args)
{
using (var cn = new SqlConnection("Server=.;Database=NORTHWND;Trusted_Connection=True;"))
{
var list = cn.GetList<Products>(
Predicates.Field<Products>(f => f.Discontinued, Operator.Eq, false)
);
}
}
class Products
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public bool Discontinued { get; set; }
}
}
}
我也尝试了你建议的Dapper.Extensions.Linq包,它承诺通过Linq查询提供高级数据库访问。其流畅的配置使设置简单而快速。
不幸的是,我在使用它时也没有走得太远。文档很少,并且测试似乎没有覆盖QueryBuilder,这似乎是将Linq表达式转换为Dapper扩展谓词所使用的类(正如问题Parsing boolean expressions with the QueryBuilder所建议的)。我尝试了下面的方法,需要将IEntity接口添加到我的DTO中-
using System;
using System.Data.SqlClient;
using System.Linq.Expressions;
using Dapper.Extensions.Linq.Builder;
using Dapper.Extensions.Linq.Core;
using DapperExtensions;
namespace StackOverflowAnswer
{
class Program
{
static void Main(string[] args)
{
using (var cn = new SqlConnection("Server=.;Database=NORTHWND;Trusted_Connection=True;"))
{
Expression<Func<Products, bool>> filter = p => !p.Discontinued;
var queryFilter = QueryBuilder<Products>.FromExpression(filter);
var list = cn.GetList<Products>(
queryFilter
);
}
}
class Products : IEntity
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public bool Discontinued { get; set; }
}
}
}
..但在运行时出现错误
未找到StackOverflowAnswer.Program+Products的运算符
我不确定为什么手动生成谓词(第一个示例)有效,但QueryBuilder却无效。
我想说的是,越来越像是你问题上的评论是正确的,你需要重新设计代码以远离使用Entity Framework的表达式。由于很难找到有关这个 QueryBuilder 类的任何信息,因此我担心即使你让它工作了,你遇到的任何问题都将难以获得帮助(而且可能会出现错误无法修复的情况)。
var query=context.SomeEntity.Where()....; query=query.Where(...); query=query.Select(...);
。如果你只想向现有查询添加过滤器,那么你不需要使用表达式。转移到微型ORM并不能使运行时构建查询更容易。 - Panagiotis Kanavos