使用DapperExtensions进行谓词化

时间:2013-01-29 14:28:05

标签: c# dapper

我试图用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帮助文档 但我尝试将其转换为通用方法。

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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