2011-11-08 15 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

私はそれをして参加しようと考えていました。私は、Entity Frameworkで使用できるものに変換する可能性のある、より単純なSQL文を期待していましたが、ストアドプロシージャに頼らざるを得なくなりました。 – Dismissile

+0

@Dismissile、サンプルコードを追加しました。 –

0

valuesリストを繰り返し処理して、毎回データベースから1つのアイテムを返すクエリを実行し、各結果をアプリケーションコードのリストに追加できますか?

+1

非効率的。リストに1000個の項目がある場合、1000個のクエリを作成するつもりはありません。 – Dismissile

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)を挿入し、次のようなクエリを構築する動的な値のリストの上に

1)反復処理し、リスト一時テーブルへと単純にクエリを実行するには、参加:

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 
関連する問題