[.net] エンティティへのLinq - SQL "IN"句


Answers

あなたの目的にはこれで十分です。 2つのコレクションを比較して、あるコレクションに他のコレクションの値と一致する値があるかどうかをチェックします

fea_Features.Where(s => selectedFeatures.Contains(s.feaId))
Question

T-SQLでは、次のようなクエリを使用できます。

SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")

あなたはLINQ to Entitiesクエリでそれをどのように複製しますか? それも可能ですか?




また、 エンティティデータモデルに対してクエリを実行するSQL-INのようなことを試みました。 私のアプローチは、大きなOR式を構成する文字列作成ツールです。 それはひどく醜いですが、私はそれが今に行く唯一の方法だと恐れています。

さて、まあ、それはこのように見えます:

Queue<Guid> productIds = new Queue<Guid>(Products.Select(p => p.Key));
if(productIds.Count > 0)
{
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("{0}.ProductId = Guid\'{1}\'", entities.Products.Name, productIds.Dequeue());
    while(productIds.Count > 0)
    {
        sb.AppendFormat(" OR {0}.ProductId = Guid\'{1}\'",
          entities.Products.Name, productIds.Dequeue());
    }
}

このコンテキストでのGUIDの使用 :上で見てきたように、クエリ文字列フラグメントのGUID ifselfの前に常に「GUID」という単語があります。 これを追加しないと、 ObjectQuery<T>.Whereは次の例外をスローします。

引数の型 'Edm.Guid'と 'Edm.String'は、この操作では互換性がありません。

これはMSDNフォーラムで見つけたことを覚えておいても助かります。

マティアス

... .NETとEntity Frameworkの次のバージョンを楽しみにしています。 :)




このコンテキストでInner Joinに行きます。 もし私がcontainsを使っていたら、ただ1つのマッチがあるという事実にもかかわらず、6回繰り返します。

var desiredNames = new[] { "Pankaj", "Garg" }; 

var people = new[]  
{  
    new { FirstName="Pankaj", Surname="Garg" },  
    new { FirstName="Marc", Surname="Gravell" },  
    new { FirstName="Jeff", Surname="Atwood" }  
}; 

var records = (from p in people join filtered in desiredNames on p.FirstName equals filtered  select p.FirstName).ToList(); 

含有の短所

2つのリストオブジェクトがあるとします。

List 1      List 2
  1           12
  2            7
  3            8
  4           98
  5            9
  6           10
  7            6

Containsを使用すると、List 2の各List 1項目を検索します。これは、繰り返しが49回起こることを意味します。




真剣に? あなたは一度も使ったことがない

where (t.MyTableId == 1 || t.MyTableId == 2 || t.MyTableId == 3)