dapper를 사용할 때 sql을 넣을 위치는 어디입니까?

asp.net-mvc-3 c# dapper n-tier

문제

나는 직장에서 mvc3 프로젝트를 위해 dapper를 사용하고 있으며, 나는 그것을 좋아한다. 그러나, 당신은 어퍼 러를 사용할 때 어플리케이션을 어떻게 레이어링해야합니까? 현재 나는 모든 SQL을 컨트롤러 ( slap )에서 직접 채워 넣었 지만 정적 문자열을 사용하여 클래스를 만드는 것을 생각하고 있었다. 그래서 할 수 있었다.

var reports = Dapper.Query<Report>(conn, MySql.ReportsRunningQuery)

당신은 어떻게 dapper를 사용할 때 SQL을 저장합니까?

수락 된 답변

나는 당신이 동등한 LINQ 쿼리, 또는 DataContext.ExecuteQuery에 대한 SQL을 넣었을 것이라고 SQL을 넣어 말할 입니다. 그것이 어디에 있는지에 관해서는 ... 잘, 그것은 당신에게 달렸으며, 당신이 얼마나 많은 이별을 원 하느냐에 달렸습니다.

그러나 개인적으로 나는 어떤 혜택이 떨어져 별도의 클래스에 SQL을 숨기는하지 참조 Query<T> 당신은 쉽게 (실제로 매개 변수 등) 데이터를 확인할 수 있도록 상황에서 그들을보고 싶어 - 전화. 당신은 또한 (여전히 파라미터 화 된) 쿼리를 in-situ으로 생성 할 수 있습니다. 하지만 정기적인 정적 쿼리의 경우 TSQL을 코드 근처의 리터럴로 유지할 것입니다. 그렇지 않으면 추상화가 필요한 좋은 이유 가없는 한 즉

var reports = conn.Query<Report>(@"
select x.blah, y.blah
from x (snip)
where x.ParentId = @parentId and y.Region = @region", new {parentId, region});

(위의 대체 확장 방법 사용에주의하십시오)

IMO, 위의 핵심은 다른 장소 에서 쿼리를 다시 사용 하지 않을 가능성매우 낮다 는 것입니다. 논리를 대신 메서드에 넣고이 메서드를 여러 위치에서 호출했습니다. 따라서 중앙 랩퍼 뒤에 u 리를 숨기는 데 사용할 수있는 다른 유일한 이유는 다른 SQL 다이얼 렉트를 사용하는 다른 데이터베이스 제공자를 지원해야하는 경우입니다. 그리고 그것은 사람들이 만드는 것보다 더 희귀합니다.


인기 답변

리소스 파일을 사용하면 정말 유용합니다. .sql 파일을 폴더 호출 / Sql에서 만들고 SqlResource 개체의 'Files'섹션으로 끌어옵니다. 리소스 파일의 '문자열'섹션은 SQL의 작은 스 니펫 (예 : 우리가 쿼리 할 수있는 함수)에 대해 실제로 쉽고 간단합니다.

그래서 우리의 sql은 다음과 같습니다.

var reports = conn.Query<Report>(SqlResource.Blahs_get, new {parentId, region});

이렇게하면 리파지토리를 실제 상태로 깨끗하게 유지할 수 있습니다. 또한 항목 전체를 반복 처리하고 잠재적으로 데이터베이스를 PARSEONLY로 쿼리하여 db 개체가 쿼리를 변경하면 쿼리가 중단 될 수 있다는 점에서 리소스 파일에 모든 sql을 추가하는 것의 이점이 있습니다 (대부분은 아니지만 100 % 신뢰).

결론적으로, 리소스 파일은 실제 코드를 깨끗하게 유지하지만 Marc Gravell은 프로덕션 코드 내에서 재사용 할 수 없습니다. 각 SQL 문은 응용 프로그램의 한 지점에서만 사용해야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.