Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用dapper的复合in语句_Sql Server_Dapper - Fatal编程技术网

Sql server 使用dapper的复合in语句

Sql server 使用dapper的复合in语句,sql-server,dapper,Sql Server,Dapper,假设我在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,

假设我在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'
假设我想得到以下结果

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();
现在,您可以高效地查询
xy
,这是计算值的索引版本

如果列在不同的表上,最好在输入和测试时分开这两个部分;dapper无法帮助您实现这一点,因此您需要使用类似于
StringBuilder
DynamicParameters
(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)

这至少可以让
colA
colB
上的索引发挥作用。

如果SQL Server支持元组会更好,但它不支持:
where (x.ColA = @a0 and y.ColB = @b0)
or (x.ColA = @a1 and y.ColB = @b1)
...
or (x.ColA = @a42 and y.ColB = @b42)