使用DapperExtensions进行谓词化

我试图用DapperExtensions创建一个通用的Find方法

这是我的方法

public IEnumerable Find(Expression<Func> expression) { using (IDbConnection cn = GetCn()) { cn.Open(); var predicate = Predicates.Field(expression, Operator.Eq, true); return cn.GetList(predicate); } } 

但是我在这行上得到了System.NullReferenceException var predicate = Predicates.Field(expression, Operator.Eq, true);

这是来自DapperExtensions帮助文档但我尝试将其转换为Generic方法。

 using (SqlConnection cn = new SqlConnection(_connectionString)) { cn.Open(); var predicate = Predicates.Field(f => f.Active, Operator.Eq, true); IEnumerable list = cn.GetList(predicate); cn.Close(); } 

我没有重新编写,但看起来问题部分在于你使表达式比示例更复杂。 作为建议,请尝试:

 public IEnumerable Find(Expression> expression, TValue value) { using (IDbConnection cn = GetCn()) { cn.Open(); var predicate = Predicates.Field(expression, Operator.Eq, value); return cn.GetList(predicate); } } 

和:

 var data = Find(p => p.MarketId, marketId); 

这完全未经测试,仅基于您的评论和示例。

如果你的代码库没有那么实用,那么我建议你只需要用上面的代码来看看是否有效 ,因为有办法拉开表达式来提取那些碎片。 但是,在我们知道上述是否有效之前,不值得举一个例子。