Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带DapperExtensions的谓词_C#_Dapper - Fatal编程技术网

C# 带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.

我正在尝试使用DapperExtensions创建一个通用的查找方法

这是我的方法

 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);