web-dev-qa-db-ja.com

SQL "IN"ステートメントのLinqバージョン

単純な「アイテムのタグ付け」スキーマの一部として、次の3つのテーブルがあります。

==アイテム==

  • ItemId int
  • ブランドvarchar
  • 名前varchar
  • 価格のお金
  • 条件varchar
  • 説明varchar
  • アクティブビット

==タグ==

  • TagId int
  • 名前varchar
  • アクティブビット

== TagMap ==

  • TagMapId int
  • TagId int(fk)
  • ItemId int(fk)
  • アクティブビット

タグのリストに一致するアイテムを返すLINQクエリを作成したい(例:TagId = 2,3,4,7)。私のアプリケーションのコンテキストでは、アイテムの例は「コンピューターモニター」、「ドレスシャツ」、「ギター」などであり、タグの例は「エレクトロニクス」、「衣類」などです。通常、これはSQLで実現します。 INステートメント。

23

何かのようなもの

var TagIds = new int[] {12, 32, 42};

var q = from map in Context.TagMaps 
        where TagIds.Contains(map.TagId)
        select map.Items;

必要なことを行う必要があります。これにより、In(12、32、42)句(または、より具体的には、パラメーター化されたIN句が誤っていない場合)が生成されます。

51
Denis Troller

与えられたアイテムの配列:

var list = new int[] {2,3,4}

使用する:

where list.Contains(tm.TagId)
15
Luke Schafer
List<int> tagIds = new List<int>() {2, 3, 4, 7};
int tagIdCount = tagIds.Count;
    //
// Items that have any of the tags
//  (any item may have any of the tags, not necessarily all of them
    //
var ItemsAnyTags = db.Items
  .Where(item => item.TagMaps
    .Any(tm => tagIds.Contains(tm.TagId))
  );

    //
// Items that have ALL of the tags
//  (any item may have extra tags that are not mentioned).
    //
var ItemIdsForAllTags = db.TagMap
  .Where(tm => tagIds.Contains(tm.TagId))
  .GroupBy(tm => tm.ItemId)
  .Where(g => g.Count() == tagIdCount)
  .Select(g => g.Key);
    //
var ItemsWithAllTags = db.Items
  .Where(item => ItemsIdsForAllTags.Contains(item.ItemId));

//runs just one query against the database
List<Item> result = ItemsWithAllTags.ToList();
1
Amy B

簡単に使えます

var TagIds = {12, 32, 42}
var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId));
1

拡張メソッド「IN()」を作成できます

public static class Extension
{
    public static bool IN(this object anyObject, params object[] list)
    { return list.Contains(anyObject); }
}

このように使用する

var q = from map in Context.TagMaps 
        where map.TagId.IN(2, 3, 4, 7)
        select map.Items;

または、単にインラインarray.Contains()表記を使用します。

var q = from map in Context.TagMaps 
        where new[]{2, 3, 4, 7}.Contains(map.TagId)
        select map.Items;
0
Micha
string[] names = {"John", "Cassandra", "Sarah"};

var results = (from n in db.Names
               where names.Contains(n.Name)
               select n).ToList();
0
IR.Programmer