2011-11-08 7 views
2

データベースから、プレーン・リスト(EFではなく)のアイテムのリストと一致するエンティティのリストを取得する必要があります。これはEntity Framework 4.1で可能ですか?Entity Framework - リストに登録する

例:

var list = new List<string> { "abc", "def", "ghi" }; 
var items = from i in context.Items 
      where list.Contains(i.Name) 
      select i; 

これは一つの特性に一致する行を返すために素晴らしい作品が、私は実際にはもっと複雑な性質を持っている:

var list = new List<Tuple<string, string>> 
{ 
    new Tuple<string,string>("abc", "123"), 
    new Tuple<string,string>("def", "456") 
}; 

// i need to write a query something like this: 
var items = from i in context.Items 
where list.Contains(new Tuple<string,string>(i.Name, i.Type)) 
select i; 

私はそれを言うだろうので、それが有効ではありません知っていますそれはプリミティブ型である必要がありますが、私が達成しようとしていることを行う方法はありますか、またはストアドプロシージャに頼る必要がありますか?

答えて

0

あなたはいくつかのオプションを持っています1)もちろん、あなたが必要とするものを実行し、それを呼び出すストアドプロシージャを書くことができます。

2)あなたはメモリにテーブルを読んで、あなたがプリミティブを使用する必要はありませんメモリのリストで...そのように問い合わせることができます:

var items = from i in context.Items.ToList() 
      where list.Contains(new Tuple<string, string>(i.Name, i.Type)) 
      select i; 

3)また、あなたを変換することができ

var items = from i in context.Items 
      join l in list 
      on new { i.Name, i.Type } equals 
       new { Name = l.Item1, Type = l.Item2 } 
      select i; 

は、私は番目限り、第二の選択肢となるだろう:クエリが同じ目標を達成するためにプリミティブを使用しますテーブルは非常に大きくはありません。さもなければ、最初に行ってください。

+0

私は#3を試みましたが、実際には機能しません。それは私の最初の試行でした... – Dismissile

+0

@Dismissile - それについては何ができませんか?期待どおりの結果やエラーではありませんか? –

+0

@JustinNiessnerクエリを実行しようとするとエラーが発生します。原始的なタイプが必要だと言います。私はそれが文字列/文字列のペアのリストをクエリに送るほどスマートではないと思います。 – Dismissile

0

サブプロパティに分割する必要があります。例えば、(これはコンパイルされないかもしれないが、私は現時点でテストすることができないんだけど、それはあなたで動作するように何かを与える必要があります)のようなもの:

var items = from i in context.Items 
where list.Select(x => x.Item1).Contains(i.Name) 
    && list.Select(x => x.Item2).Contains(i.Type) 
select i; 
+0

動作しません。実行しようとするとエラーが発生します。 Test.Pair型の定数を作成できません。このコンテキストでは、プリミティブ型のみがサポートされています。 – Dismissile

0

結果のSQLがどのように見えるか考える必要がありますが、これはSQLで直接行うのは難しいでしょう。

タプルの1つのフィールドを分割し、これを使用して結果リストを切り取り、クエリ結果を取得してから再びタプルの1つに一致するようにフィルタリングすることをお勧めします。

var list = new List<string> { "abc", "def" }; 
var list2 = new List<Tuple<string, string>> 
{ 
    new Tuple<string,string>("abc", "123"), 
    new Tuple<string,string>("def", "456") 
}; 
var items = (from i in context.Items 
     where list.Contains(i.Name) 
     select i) 
     .AsEnumerable() 
     .Where(i => list2.Any(j => j.val1 == i.Name && j.val2 == i.Type); 
+0

私の場合は実用的な解決策ではありません。名前とタイプは基本的に私のためにユニークなキーを形成します。名前自体があまりにも多くの行を返します。私は、ストアドプロシージャを作成し、テーブル値のパラメータを使用する必要があると思う。 – Dismissile

+0

または、あなたのタプルを一時テーブルに書き込んでデータベースに参加させることもできます –

関連する問題