4

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

1 に答える 1

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

これは、コメントと例だけに基づいて、完全にテストされていません。

あなたのコードベースがそれを実用的にしない場合は、式を分解してそれらの部分を抽出する方法があるため、上記で試して、それが機能するかどうかを確認することをお勧めします. しかし、上記が機能するかどうかがわかるまで、その例を示す価値はありません。

于 2013-01-30T08:58:06.243 に答える