다퍼를 사용하여 문에서 합성

dapper sql-server

문제

sql2008에 2 개의 테이블이 있다고 가정합니다.

create table table1 (
location varchar(10), 
facility varchar(10),
msgid int,
col5 varchar(20)
)

create table table2 (
msgid int,
name varchar(10),
col3 varchar(20),
col4 varchar(20)
)

insert into table1 (msgid, location, facility, col5) 
select 1, 'F1', 'L1', 'xyz'
union select 2,  'F1', L1', 'abc'
union select 3,  'F1', L1', 'abcd'
union select 4,  'F1', L2', 'abce'
union select 5,  'F2', L1', 'abcf'


insert into table2 (msgid, name, col3, col4)
select 1, 'x', 'dsd','fwefrwe'
union select 2, 'x', 'dsd1','fwefrwe1'
union select 3, 'y', 'dsd2','fwefrwe2'
union select 4, 'z', 'dsd3','fwefrwe3'
union select 5, 'a', 'dsd4','fwefrwe4'

다음과 같은 결과를 얻고 싶다고 가정 해 보겠습니다.

select col3,col4,col5 from table1 inner join table2 where name+'^'+facility+'^'+location in ('x^F1^L1', 'z^F1^L2')

이 문자열을 연결하는 것이 최악의 경우 중 하나라는 것을 이해합니다. 그러나이 구문을 최적화하는 더 세련된 방법이 있는지 묻고 Dapper에서 사용할 수 있습니까?

많은 감사

수락 된 답변

예를 들어, 다음과 같이 후보 위치가 일종의 목록 또는 배열에 있다고 가정합니다.

var locations = new[] { "x^F1^L1", "z^F1^L2" };

그럼 당신은 사용할 수 있습니다 :

var rows conn.Query<SomeType>(@"
    select col3,col4,col5 from table1 inner join table2
    where name+'^'+facility+'^'+location in @locations",
        new { locations }).AsList();

Dapper가 자동으로 확장 작업을 수행합니다.

효율적으로 ; 두 필드가 같은 테이블에 있다고 가정 할 때 계산 된 지속 된 인덱싱 된 열을 만들 수 있습니다.

create table SomeTable (x nvarchar(20) not null, y nvarchar(20) not null);
alter table SomeTable add xy as x + ':' + y persisted;
create nonclustered index  SomeTable_xy on SomeTable(xy);

이제 계산 된 값의 인덱싱 된 버전 인 xy 에 대해 효율적으로 쿼리 할 수 ​​있습니다.

열이 다른 테이블에 있으면 입력에서 두 가지 분리하고 별도로 테스트 하는 것이 좋습니다. dapper가이 작업을 도와 줄 수는 없으므로 StringBuilderDynamicParameters (dapper)와 같은 것을 사용하여 쿼리를 구성해야하지만 다음과 같은 내용이 필요합니다.

where (x.ColA = @a0 and y.ColB = @b0)
or (x.ColA = @a1 and y.ColB = @b1)
...
or (x.ColA = @a42 and y.ColB = @b42)

적어도 colAcolB 의 인덱스를 유용하게 colB 수 있습니다.



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