2017-12-21 19 views
3

EF6を使用して、Find(key1.a, key1.b)メソッドを使用して複合主キーでエンティティを取得できます。EF複合キーの配列で検索

また、私はEFは、キーによる検索のための二つの方法がある理由を知りたい:

は、それは、複数のキーのためにすなわち

var keys = new [] {new {a = 1, b = 2}, new {a = 2, b = 3}, /*etc*/}; 
var entities = context.Items.Find(key1.a, key1.b, key2.a, key2.b, ..., keyN.a, keyN.b); 

UPDを同じことを行うことは可能ですFindをし、 LINQのWhereSingleなど

+0

のための拡張メソッドを書くことができます。 DbSet .Findメソッドは文書化されており、単一のエンティティのみを返します –

+0

@SirRufo:固定、ありがとうございます。そのときの回避策を知りたいと思います。 –

+0

いくつかのRDBMはタプル(化合物の主キーなど)を[like this](https://stackoverflow.com/a/8011075/314291)という構文で 'IN'にすることができます。しかし、[あまりにもSqlServer](https://connect.microsoft.com/SQLServer/feedback/details/299231/add-support-for-ansi-standard-rowvalue-constructors)。 '(KeyCol1 = Value1 AND KeyCol2 = Value2)OR(KeyCol1 = ..)' – StuartLC

答えて

1

documentationはここにかなり明確である:それは可能

ではありません
  1. あなたが複数のPKを渡すことができればそれだけで簡単にケースかもしれない
  2. は、それが実際に与えられた主キーを持つ複数のエンティティが存在する場合に例外をスローする単一のエンティティを返しますが

最高値

context.Items.Where(x => keys.Any(y => y.a == x.a && y.b == x.b)) 
+0

Ok。それを行う別の方法はありますか?私はそれがかなり普及しているユースケースだと思う:そのようなキーの配列によって見つける。 –

+0

私の編集をご覧ください。これが正しくSQLに変換できるかどうかは100%確かではありません。できない場合は例外が発生します。もしそうなら、ここに戻って来てください。別の解決策を探してみましょう –

1

あなたは1のために何かを行うことができる場合、あなたは1何回も同じことを繰り返すことで、同様の多くのためにそれを行うことができます:アクションのコースは、LINQのWhereを使用するようになります。

あなたはDbContextクラスは何のFindメソッドを持っていないこの

public static class IDbSetExtensions 
{ 
    public static ICollection<T> FindMany(this IDbSet<T> @this, IEnumerable<object[]> keys) 
    { 
     return keys.Select(key => @this.Find(key)).ToList(); 
    } 
} 
+2

これは多くのデータベースヒットを招く可能性があります。慎重に使用してください! –