Opérateur "IN" à Linq

c# c#-3.0 entity-framework linq

Question

J'essaie de convertir une ancienne requête Sql brute dans Linq avec Entity Framework ici.

Il utilisait l'opérateur IN avec une collection d'éléments. La requête était quelque chose comme ça:

SELECT Members.Name
FROM Members
WHERE Members.ID IN ( SELECT DISTINCT ManufacturerID FROM Products WHERE Active = 1)
ORDER BY Members.Name ASC

Comme le retour de la sous-requête n'est pas une chaîne unique, mais une collection de chaînes, je ne peux pas utiliser la méthode String.Contains() .

J'ai pensé faire quelque chose comme:

var activeProducts = (
from products in db.ProductSet
where product.Active == true
select product.ManufacturerID);

et alors

var activeMembers = (
from member in db.ContactSet
where member.ID.ToString().Contains(activeProducts));

mais il s’arrête au niveau des contenus en indiquant que les arguments ne sont pas valides ... Je ne peux pas sélectionner activeProducts.ManufacturerID, car la propriété n’est manifestement pas présente car elle renvoie un IQueryable ...

En bout de ligne, ce que j'essaie de faire ici, c'est de renvoyer une liste de membres qui ont au moins un produit actif.

Un indice?

[modifier]

Voici le code de requête complet ... J'ai essayé avec le contenu de la deuxième expression, Linq ne semblait pas aimer ça:

Server Error in '/' Application. LINQ to Entities does not recognize the method 'Boolean Contains[String](System.Linq.IQueryable``1[System.String], System.String)' method, and this method cannot be translated into a store expression.

    var activeProduct =(from product in Master.DataContext.ProductSet
                        where product.Active == true
                           && product.ShowOnWebSite == true
                           && product.AvailableDate <= DateTime.Today
                           && ( product.DiscontinuationDate == null || product.DiscontinuationDate >= DateTime.Today )
                        select product.ManufacturerID.ToString() );

    var activeArtists = from artist in Master.DataContext.ContactSet
                        where activeProduct.Contains(artist.ID.ToString())
                        select artist;

    NumberOfArtists = activeArtists.Count();

    artistsRepeater.DataSource = activeArtists;
    artistsRepeater.DataBind();

[Plus de détails] ManufacturerID est un GUID nullable apparemment ...

Pour une raison quelconque, la classe ContactSet ne contient aucune référence aux produits. Je suppose que je devrai faire une requête de jointure, aucun indice ici.

Réponse acceptée

var activeMembers = (
from member in db.ContactSet
where activeProducts.Select(x=>x.ID).Contains(member.ID));

Réponse populaire

Essayez where activeProducts.Contains(member.ID) .
EDIT : Avez-vous essayé sans ToString s?



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow