"IN" Operator in Linq

c# c#-3.0 entity-framework linq

Frage

Ich versuche, eine alte unbearbeitete SQL-Abfrage in Linq mit Entity Framework zu konvertieren.

Es verwendete den IN-Operator mit einer Sammlung von Elementen. Die Abfrage war so ähnlich:

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

Da die Rückgabe der Unterabfrage keine einzelne Zeichenfolge ist, sondern eine Auflistung von Zeichenfolgen, kann ich die Methode String.Contains() verwenden.

Ich dachte darüber nach, etwas zu tun:

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

und dann

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

Aber es hört auf, wenn es sagt, es hat ungültige Argumente ... Ich kann activeProducts.ManufacturerID nicht auswählen, da offensichtlich das Eigentum nicht vorhanden ist, da es ein IQueryable zurückgibt

Im Endeffekt versuche ich hier eine Liste der Mitglieder mit mindestens einem aktiven Produkt zurückzugeben.

Irgendein Hinweis?

[bearbeiten]

Hier ist der vollständige Abfragecode ... Ich habe es mit dem Inhalt des zweiten Ausdrucks versucht, Linq schien es nicht zu mögen:

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();

[Weitere Details] ManufacturerID ist anscheinend eine nullfähige GUID ...

Aus irgendeinem Grund enthält die ContactSet-Klasse keinen Hinweis auf die Produkte, von denen ich denke, dass ich eine Join-Abfrage durchführen muss, hier keine Hinweise.

Akzeptierte Antwort

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

Beliebte Antwort

Versuchen Sie, where activeProducts.Contains(member.ID) .
EDIT : Hast du es ohne ToString ?



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum