我试图用DapperExtensions创建一个通用的Find方法
这是我的方法
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);
}
}
但是我在这行上得到了System.NullReferenceException
var predicate = Predicates.Field<T>(expression, Operator.Eq, true);
这是来自DapperExtensions帮助文档但我尝试将其转换为Generic方法。
using (SqlConnection cn = new SqlConnection(_connectionString))
{
cn.Open();
var predicate = Predicates.Field<Person>(f => f.Active, Operator.Eq, true);
IEnumerable<Person> list = cn.GetList<Person>(predicate);
cn.Close();
}
我没有重新编写,但看起来问题部分在于你使表达式比示例更复杂。作为建议,请尝试:
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);
这完全未经测试,仅基于您的评论和示例。
如果你的代码库,并不意味着实际的,那么我建议刚好与上述尝试 ,看看是否能工程 ,因为有拉开的表达式来提取这些作品的方式。但是,在我们知道上述是否有效之前,不值得举一个例子。