Dapper를 사용하여 IN 절의 매개 변수로 항목 목록 (null 일 수 있음)을 전달합니다.

c# dapper sql sql-server sql-server-2008

문제

Dapper를 사용하여 항목의 NULL 목록을 매개 변수로 전달하려고 할 때 NULL 참조 예외가 발생합니다. 일반적으로 내 where 절에서는 다음과 같이 간단하게 수행합니다.

"AND (@Sections IS NULL OR Section IN @Sections)";

그러나 섹션 목록에 항목이있는 경우에도 작동하지 않기 때문에이 작업을 수행 할 수 없습니다. Dapper가 매개 변수로 매개 변수를 추가하고 (@ sections1, @ sections2 IS NULL OR) 오류가 발생합니다. 필터로 사용하고 싶지 않기 때문에 섹션 목록을 null로두면 NULL 참조 예외가 발생합니다.

내 함수는 선택적 매개 변수로 섹션 목록을 가져야합니다. 이 방법은 내 코드에서 항상 필자의 쿼리에 섹션 필터를 추가 할 필요는 없습니다. 내 함수 params에 섹션을 nullable리스트로 만들 수있을뿐만 아니라 NULL 일 때 Dapper에서도 사용할 수 있습니까?

여기 내 코드가 있습니다 :

public static IEnumerable<Product> GetProformaFormularies(int? categoryId = null, IEnumerable<int> sections = null)
{
    using (var context = new AppContext())
    {
        var sql =
        "SELECT * " +
        "FROM Products " +
        "WHERE (@CategoryId IS NULL OR CategoryId = @CategoryId) " +
          "AND (Section IN @Sections)";

        return context.Database.Connection.Query<Product>(sql, 
        new { 
                CategoryId = categoryId,
                Sections = sections
            }).ToList();
    }
}

내가 생각해 낸 유일한 해결책은 동적 매개 변수를 사용하는 것입니다. 이보다 더 좋은 방법이 있습니까?

var sql =
    "SELECT * " +
    "FROM ProformaFormulary " +
    "WHERE (@CategoryId IS NULL OR CategoryId = @CategoryId) " +

if (sections != null)
{
    sql += " AND (Section IN @Sections)";
}

var parameters = new DynamicParameters();
parameters.Add("@CategoryId", categoryId);
if (sections != null)
{
    parameters.Add("@Sections", sections);
}

수락 된 답변

sectionsnull 경우 WHERE 절의 해당 부분을 생략 할 수 있습니다.

var sql =
    "SELECT * " +
    "FROM Products " +
    "WHERE (@CategoryId IS NULL OR CategoryId = @CategoryId) ";

if (sections != null)
{
    sql += "AND (Section IN @Sections)"
}

return context.Database.Connection.Query<Product>(sql, 
    new { 
            CategoryId = categoryId,
            Sections = sections
        }).ToList();

그것은 dapper가 적용하지 않는 경우 지나가는 객체의 Sections 속성을 무시하는 것처럼 보입니다.


인기 답변

제 의견으로는 if 문은 코드에서 가끔은 원하는 것이 아닙니다. 때로는 .sql 파일 만 실행합니다. 그래서 나를 위해 일한 유일한 방법은 이것입니다.

var parameters = new
            {
                ApplySectionFilter = stringsToFilter != null,
                Sections = stringsToFilter 
            };

조금 오버 헤드가 있지만 결국에는 더 깨끗합니다. 내 의견으로는.

SELECT * FROM Products
    WHERE (@ApplySectionFilter = 0 OR Section IN @Sections)


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