2017-07-21 3 views
0

Ich habe eine Liste von Produkten, und ich habe ProductMetadatas in der Abfrage wie folgt enthalten:zwei Lambda-Ausdrücke in einer einzigen Abfrage

var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas). 
    Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active).ToList(); 

Nun, was ich tun möchte, ist ich die ProductMetadats nach filtern will die CompanyId, wie

var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas). 
    Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active && 
      x.ProductMetadatas.Where(pm => pm.CompanyId == LoggedInUser.CompanyId)).ToList(); 

Wie kann ich es in einer einzigen Abfrage tun?

+2

Und was ist dein Problem dabei? Welche Ergebnisse bekommst du und was hast du erwartet? – HimBromBeere

+0

Möchten Sie nur Produkte, die über ProductMetaData verfügen, die mit der Firmen-ID übereinstimmen oder alle ProductMetedatas mit der Firmen-ID übereinstimmen? –

Antwort

2

Wenn Sie alle wollen Produkte, die tatsächlich ihren aktuellen Benutzer passen CompanyID Sie es an die sich ändern müssen folgende:

var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas). 
Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active && 
     x.ProductMetadatas.Any(pm => pm.CompanyId == LoggedInUser.CompanyId)).ToList(); 

Wie Sie .Any erraten kann() prüft, ob jedes Element in der Liste entspricht Ihrem LINQ-Ausdruck und gibt einen booleschen Wert zurück. Damit ist dein Ausdruck gültig.

Bisher konnte es nicht funktionieren, weil .Where() eine Liste der Elemente zurückgibt.

EDIT:

In Ordnung, wie es wurde festgestellt, dass Sie die ProductMetdatas anpassen möchten, können Sie wie folgt vorgehen:

eine Erweiterung erstellen für IEnumerable<T>:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    foreach(T item in source) 
     action(item); 
} 

Und dann passen Sie Ihren LINQ wie folgt an:

var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas). 
    Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active). 
    ForEach(x => x.ProductMetadatas = x.ProductMetadatas. 
    Where(pm => pm.CompanyId == LoggedInUser.CompanyId).ToList()).ToList(); 

Jetzt rufen Sie für jedes Element eine Funktion auf, die die ProductMetadaten filtert und die Eigenschaft Ihres Produkts für die gefilterten ProductMetadaten festlegt.

+0

Er will "die ProductMetadatas filtern", er will die Produkte nicht filtern –

0

Sie können die Verknüpfung zum Filtern verwenden.

var result = (from tbl in _dbContext.Set<Product>() 
        join lst in ProductMetadatas on lst.CompanyID eqauls LogginInUSer.CompanyID 
        where tbl.CompanyId == LoggedInUser.CompanyId && tbl.Active 
select tbl) 
Verwandte Themen