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 도움말 문서에서 나온 것입니다.하지만 이것을 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();
}

수락 된 답변

나는 repro'd하지 않은,하지만 문제가있다처럼 당신이 예보다 표현이 더 복잡하게되어, 부분적으로 보인다. 제안으로서 다음을 시도하십시오.

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

이것은 귀하의 의견과 예제를 바탕으로 완전히 테스트되지 않았습니다.

코드베이스가 실용적하지 않는 경우 그 조각을 추출하는 식을 떨어져 당기는 방법이 있기 때문에, 그때, 그 작동하는지 확인하기 위해 위의 그것을 시도 단지 제안합니다. 그러나 위의 효과가 있는지 여부를 알기까지는 그 예가 될 가치가 없습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow