web-dev-qa-db-fra.com

Version Linq de l'instruction SQL "IN"

J'ai les 3 tableaux suivants dans le cadre d'un simple schéma de "marquage d'objet":

== Articles ==

  • ItemId int 
  • Marque varchar 
  • Nom varchar 
  • Prix ​​de l'argent 
  • Condition varchar 
  • Description de varchar 
  • Bit actif

== Tags ==

  • TagId int
  • Nom varchar
  • Bit actif

== TagMap ==

  • TagMapId int
  • TagId int (fk)
  • ItemId int (fk)
  • Bit actif

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.

22

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).

49
Denis Troller

tableau donné d'éléments:

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

utilisation:

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

Vous pouvez simplement utiliser,

var TagIds = {12, 32, 42}
var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId));
1
Anish Karunakaran
string[] names = {"John", "Cassandra", "Sarah"};

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