我有一个从Web服务调用中检索到的对象列表,我需要将它们与我的一个数据库表中的某些行匹配。我的对象有一些属性:
Name - string
Type - string
Together Name和Type将在我的数据库中带回一个唯一的项目:
SELECT * FROM dbo.MyTable WHERE SomeName = @Name AND SomeType = @Type
这很好用;但是,我有一个名称/类型对列表,需要匹配我的数据库中的行:
List<Tuple> values = [{ "Name1", "Type1" }, { "Name2", "Type2" }, { "Name3", "Type3" }]
我怎样才能在SQL中编写一个基于元组列表返回项目列表的查询。上面的格式实际上并不是我的值的格式,所以不要担心编写一些解析逻辑来获取值。
答案 0 :(得分:2)
您可以使用Table-Valued Parameters in SQL Server 2008 (ADO.NET)。
<强> SQL 强>
CREATE TYPE [dbo].[MyTableType] AS TABLE
(
[SomeName] NVARCHAR(50),
[SomeType] NVARCHAR(50)
)
CREATE TABLE [dbo].[MyTable]
(
[SomeName] NVARCHAR(50),
[SomeType] NVARCHAR(50)
)
INSERT [dbo].[MyTable]
VALUES ('Name1', 'Type1'),
('Name2', 'Type2'),
('Name3', 'Type3'),
('Name4', 'Type4')
<强> C#强>
var values = new List<Tuple<string, string>> { Tuple.Create("Name1", "Type1"), Tuple.Create("Name2", "Type2"), Tuple.Create("Name3", "Type3") };
var dataTable = new DataTable();
dataTable.Columns.Add(new DataColumn("SomeName", typeof(string)));
dataTable.Columns.Add(new DataColumn("SomeType", typeof(string)));
values.ForEach(v => dataTable.Rows.Add(v.Item1, v.Item2));
using (var connection = new SqlConnection(@"Data Source=.;Initial Catalog=Tom;Integrated Security=True"))
{
using (var command = new SqlCommand())
{
command.Connection = connection;
command.CommandText =
"SELECT * " +
"FROM [dbo].[MyTable] mt " +
"INNER JOIN @MyTableType mtt " +
" ON mt.[SomeName] = mtt.[SomeName] " +
" AND mt.[SomeType] = mtt.[SomeType]";
SqlParameter parameter = command.Parameters.AddWithValue("@MyTableType", dataTable);
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "[dbo].[MyTableType]";
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("mt.[SomeName]: {0}, mt.[SomeType]: {1}, mtt.[SomeName]: {2}, mtt.[SomeType]: {3}",
reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3));
}
}
}
Console.ReadKey();
答案 1 :(得分:1)
我能想到的几个选项:
1)迭代值列表并动态构建如下所示的查询:
SELECT *
FROM dbo.MyTable
WHERE (SomeName = values[0][0] and SomeType = values[0][1])
OR (SomeName = values[1][0] and SomeType = values[1][1])
OR (SomeName = values[2][0] and SomeType = values[2][1])
2)将列表插入临时表并将查询作为简单连接运行:
CREATE TABLE #tuples
(Name varchar(max), Type varchar(max))
--Insert the list into the #tuples table (several ways to do this)
SELECT *
FROM dbo.MyTable m
join #tuples t on m.SomeName = t.Name
and m.SomeType = t.Type
DROP TABLE #tuples
答案 2 :(得分:0)
您是否可以遍历values
列表,执行每次从数据库返回一个项目的查询,并将每个结果添加到应用程序代码中的列表中?