使用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);
这完全未经测试,仅基于您的评论和示例。
如果你的代码库没有那么实用,那么我建议你只需要用上面的代码来看看是否有效 ,因为有办法拉开表达式来提取那些碎片。 但是,在我们知道上述是否有效之前,不值得举一个例子。