単純な「アイテムのタグ付け」スキーマの一部として、次の3つのテーブルがあります。
==アイテム==
==タグ==
== TagMap ==
タグのリストに一致するアイテムを返すLINQクエリを作成したい(例:TagId = 2,3,4,7)。私のアプリケーションのコンテキストでは、アイテムの例は「コンピューターモニター」、「ドレスシャツ」、「ギター」などであり、タグの例は「エレクトロニクス」、「衣類」などです。通常、これはSQLで実現します。 INステートメント。
何かのようなもの
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句が誤っていない場合)が生成されます。
与えられたアイテムの配列:
var list = new int[] {2,3,4}
使用する:
where list.Contains(tm.TagId)
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();
簡単に使えます
var TagIds = {12, 32, 42}
var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId));
拡張メソッド「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;
string[] names = {"John", "Cassandra", "Sarah"};
var results = (from n in db.Names
where names.Contains(n.Name)
select n).ToList();