C# 带DapperExtensions的谓词
我正在尝试使用DapperExtensions创建一个通用的查找方法 这是我的方法C# 带DapperExtensions的谓词,c#,dapper,C#,Dapper,我正在尝试使用DapperExtensions创建一个通用的查找方法 这是我的方法 public IEnumerable<T> Find(Expression<Func<T, object>> expression) { using (IDbConnection cn = GetCn()) { cn.Open(); var predicate = Predicates.
public IEnumerable<T> Find(Expression<Func<T, object>> expression)
{
using (IDbConnection cn = GetCn())
{
cn.Open();
var predicate = Predicates.Field<T>(expression, Operator.Eq, true);
return cn.GetList<T>(predicate);
}
}
我还没有重述,但问题似乎在某种程度上是,你使表达式比示例更复杂。作为建议,请尝试:
public IEnumerable<T> Find<TValue>(Expression<Func<T, TValue>> expression,
TValue value)
{
using (IDbConnection cn = GetCn())
{
cn.Open();
var predicate = Predicates.Field<T>(expression, Operator.Eq, value);
return cn.GetList<T>(predicate);
}
}
仅根据您的评论和示例,这是完全未经测试的
如果您的代码库不能实现这一点,那么我建议您尝试一下上面的方法,看看是否有效,因为有一些方法可以分离表达式来提取这些片段。但是,在我们知道上述方法是否有效之前,不值得举一个这样的例子。您传递的是哪种表达方式?因为值得注意的是,这个例子是
Func
,而你的例子是Func
——这是我能看到的最明显的区别……这就是我传入的结果(p=>p.MarketId==MarketId);谢谢你的回答。在这一行上,var谓词=谓词.Field(表达式、运算符.Eq、值);我得到了“与DapperExtensions.Predicates.Field(System.Linq.Expressions.Expression,DapperExtensions.Operator,object,bool)最匹配的重载方法”有一些无效的参数。我将TValue更改为Object,现在它运行得很好。谢谢!!@MarcGravel回答得很好-如何实现它,以便我们可以这样调用Find:var matchingPersons=conn.Find(p=>p.MarketId==MarketId);
。我想分离表达式,以便构建GetList()的谓词要求:参数(p.MarketId
)、运算符(operator.Eq,operator.Gt,operator.Lt…
)和值(MarketId
)。谢谢。@SameerSingh您是如何处理的?您应该可以找到lambda。主体是一个等式表达式,带有一个“left”成员表达式,该表达式接受成员“MarketId”右边可能是ConstantExpression上的MemberExpression(marketId),ConstantExpression是捕获的变量范围实例。因此,它应该展开得很漂亮easily@MarcGravell你的建议是有道理的(除了我尝试使用二进制表达式),但没有运气(关于这一点,我已经发布了另一个问题。关于@anpe的评论,我们必须使用表达式
public IEnumerable<T> Find<TValue>(Expression<Func<T, TValue>> expression,
TValue value)
{
using (IDbConnection cn = GetCn())
{
cn.Open();
var predicate = Predicates.Field<T>(expression, Operator.Eq, value);
return cn.GetList<T>(predicate);
}
}
var data = Find(p => p.MarketId, marketId);