LINQ 자동 생성 형식을 사용하는 Dapper 매개 변수가있는 쿼리

c# dapper linq

문제

저는 LINQ와 Dapper의 조합을 사용하고 있습니다. 퍼포먼스상의 이유로 LINQ 코드를 Dapper로 대체하려고합니다. SQL Server에서 Visual Studio 데이터베이스 다이어그램으로 드래그 앤 드롭하여 많은 LINQ 데이터 개체를 만들었습니다.

다음 인스턴스에서는 이미 메모리에 LINQ 개체가 있고이를 쿼리의 매개 변수로 Dapper로 전달하려고합니다. 예 :

Animal animal = con.Query<Animal>(" select * " +
        " from animal " +
        " where animalid = @AnimalId " +
        " and animaltype = @AnimalType ",
        cagedAnimal).SingleOrDefault();

cagedAnimal에는 getters 및 setters가있는 AnimalId 및 AnimalType 공용 속성이 포함되어 있습니다.

그러나이 코드를 실행하면 다음과 같은 오류가 발생합니다.

유형 : SMDApp.Models.Animal은 dapper에서 지원하지 않습니다.

다음 코드가 작동합니다.

Animal animal = con.Query<Animal>(" select * " +
            " from animal " +
            " where animalid = @AnimalId " +
            " and animaltype = @AnimalType ",
            new 
            { 
            AnimalId = cagedAnimal.AnimalId, 
            AnimalType = cagedAnimal.AnimalType 
            }
            ).SingleOrDefault();

필자가 객체의 둘 이상의 속성을 쿼리의 매개 변수로 사용하고있는 곳에서 기존 객체를 사용하는 것이 더 편리 할 것입니다. 아무도 왜 내 익명의 개체에 대해 작동하지만 자동 생성 된 LINQ 개체에 대해서는 알 수 없습니까?

벤 로빈슨의 대답에 대한 편집.

Marc Gravell의 답변에 대한 응답으로 두 번째 편집되었습니다.

수락 된 답변

짧은 버전은 이미 작동해야합니다 . 오류를 기반으로 :

유형 : SMDApp.Models.CagedAnimal은 dapper에서 지원하지 않습니다.

나는 당신이 실제로 new {cagedAnimal} 대신 new {cagedAnimal}cagedAnimal 하고 있거나 CagedAnimal 자체가 CagedAnimal 이며 대 CagedAnimal 이해할 수없는 속성 ( Parent , 아마도?)을 가지고 있다고 결론을 내 CagedAnimal . 현재의 동작은 제공된 매개 변수 객체의 모든 public 속성대해 매개 변수가 추가된다는 것입니다. 그리고 매개 변수 객체를 데이터베이스로 보내는 방법을 알아 내지 못하면 불평합니다. 당신은 가치있는 멤버들과 함께 간단한 POCO가 잘 작동한다는 것을 발견해야합니다.

하나! SQL 구문 분석을 시도하지 않는다는 점에 유의하십시오. 특히 제공되는 쿼리의 매개 변수를 확인하지는 않습니다. 따라서 POCO 방식을 사용하면 쿼리에 불필요한 속성을 추가하게됩니다.

우리는 광범위하게 dapper를 사용하기 때문에 다음과 같은 접근 방식을 사용합니다.

 new { obj.Foo, obj.Bar, id, key = "something else" }

인기 답변

Marc은 특히이 문제해결하기 위해 다음과 같이 변경했습니다.

  1. 속성을 params로 변환하려고 시도하기 전에 간단한 검증을 수행합니다. 예를 들어 Dapper는이 경우 서버에 매개 변수를 보내지 않습니다. cnn.Query ( "select 1", new {bla = 1}) 원인 "bla"가 문자열에 없습니다. 이 유효성 검사는 저장된 procs에 대해 건너 뜁니다.

  2. 오히려 비밀 스럽던 오류가 수정되어 훨씬 개선되었습니다.

-

Dapper는 기본 SQL 문을 구문 분석하지 않으므로 예를 들면 다음과 같습니다.

@"select * 
from animal
where animalid = @AnimalId"

@AnimalId 라는 단일 매개 변수가 들어 있습니다.

그것은 복잡한 원인을 가져 @AnimalId . 100 % 정확해야합니다. 가장자리 케이스를 처리해야합니다. EG : 문자열에 select '@AnimalId' -- @AnimalId \* @AnimalId *\ ? 정규 표현식은 조금 까다로워, 모든 경우를 생각하지 못했습니다. 예 : Oracle은 params 앞에 a : 를 붙입니다.

dapper는 문자열의 매개 변수에 대해 아무 것도 모르기 때문에 모든 공용 속성을 매개 변수로 보내기로 결정했습니다. 일부 공용 속성을 DbParameters 매핑 할 수 없으므로 불만을 제기합니다.



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