J'ai les 3 tableaux suivants dans le cadre d'un simple schéma de "marquage d'objet":
== Articles ==
== Tags ==
== TagMap ==
Je souhaite écrire une requête LINQ afin de ramener les éléments correspondant à une liste de balises (par exemple, TagId = 2,3,4,7). "Moniteur d'ordinateur", "Chemise de ville", "Guitare", etc. sont des exemples d'éléments tels que "électronique", "vêtements", etc. Je le ferais normalement avec un code SQL. EN déclaration.
Quelque chose comme
var TagIds = new int[] {12, 32, 42};
var q = from map in Context.TagMaps
where TagIds.Contains(map.TagId)
select map.Items;
devrait faire ce dont vous avez besoin. Cela générera une clause In (12, 32, 42) (ou plus précisément une clause IN paramétrée si je ne me trompe pas).
tableau donné d'éléments:
var list = new int[] {2,3,4}
utilisation:
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();
Vous pouvez simplement utiliser,
var TagIds = {12, 32, 42}
var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId));
string[] names = {"John", "Cassandra", "Sarah"};
var results = (from n in db.Names
where names.Contains(n.Name)
select n).ToList();