c# - 带有 DapperExtensions 的谓词

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

最佳答案

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

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

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

如果您的代码库不能使它变得实用,那么我建议您尝试它与上面的代码一起看看它是否有效,因为有很多方法拉开一个表达式来提取这些片段。但在我们知道上述是否有效之前,不值得举一个例子。

关于c# - 带有 DapperExtensions 的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14585212/

相关文章:

c# - Entity Framework : Injecting dependencies into entities when other options are problematic

类型参数化抽象类的 C# 构造函数

c# - 如何捕获通过 Ado.Net 发送的所有 SQL

mysql - 即使表中有数据,数据也不是来自数据库,ORM 是 Dapper

c# - 在没有 Entity Framework 的情况下在 MVC 中保存数据?

c# - 如何在不直接将参数传递给 ln 实用程序的情况下从应用程序内部创建硬链接(hard link) (Linux)?

c# - .Assembly/GetExportedTypes 抛出 FileNotFoundException

c# - 具有损坏索引的对象的 Razor Pages 模型绑定(bind)列表

c# - 使用异步等待在 ForEach 中获取 "The connection does not support MultipleActiveResultSets"

c# - 使用 ToList 的异步、等待和任务