2011-11-08 81 views
3

我有一個從Web服務調用中檢索到的對象列表,我需要將它們與我的某個數據庫表中的某些行進行匹配。我的對象有幾個特性:SQL查詢 - 從項目/元組列表中選擇

Name - string 
Type - string 

共同名稱和類型會帶回一個獨特的項目在我的數據庫:

SELECT * FROM dbo.MyTable WHERE SomeName = @Name AND SomeType = @Type 

也能正常工作;但是,我有名稱/類型對的列表,需要對陣排在我的數據庫:

List<Tuple> values = [{ "Name1", "Type1" }, { "Name2", "Type2" }, { "Name3", "Type3" }] 

我怎麼能寫在SQL查詢將返回基於元組的名單上的項目列表。上面的格式實際上並不是我的值的格式,所以不用擔心編寫一些解析邏輯來獲取值。

回答

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(); 
+0

我正在考慮這樣做並加入。我希望有一個簡單的SQL語句可以轉化爲我可以用於Entity Framework的東西,但它看起來越來越像我將不得不訴諸於存儲過程。 – Dismissile

+0

@Dismissile,我添加了一些示例代碼。 –

0

您可以遍歷values列表,執行查詢,每次從數據庫返回一個項目,並將每個結果添加到應用程序代碼中的列表中?

+1

效率低下。如果我的清單中有1000個項目,我不打算提出1000個查詢。 – Dismissile

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