compuesto en declaración usando dapper

dapper sql-server

Pregunta

Supongamos que tengo 2 tablas en sql2008

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'

Supongamos que quiero dar el siguiente resultado

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

Entiendo que concatenar la cadena como esta es una de las peores cosas que hacer, pero ¿puedo preguntar si hay una manera más elegante de optimizar esta afirmación y se puede usar en Dapper?

Muchas gracias

Respuesta aceptada

Por el lado inteligente de las cosas, voy a suponer que las ubicaciones candidatas están en algún tipo de lista o matriz, por ejemplo:

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

Entonces puedes usar:

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

Dapper hará la expansión automáticamente.

En cuanto a hacerlo eficiente ; podría crear una columna indizada persistente calculada, suponiendo que los dos campos están en la misma tabla:

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

Ahora puede consultar eficientemente contra xy que es una versión indexada del valor calculado.

Si las columnas están en tablas diferentes, sería mejor dividir las dos cosas en la entrada y probarlas por separado; Dapper no puede ayudarte con esto, por lo que necesitarías usar algo como un StringBuilder y DynamicParameters ( DynamicParameters ) para construir la consulta, pero querrías algo como:

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

Esto al menos permite que los índices en colA y colB sean útiles.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué