2016-05-11 14 views
4

Ich mag einen Lambda-Ausdruck erstellen durch eine SammlungLambda-Ausdruck eine Sammlung von einer Sammlung abzufragen

In einer EF-Code ersten Umgebung eine Sammlung abzufragen, ich habe die folgenden Datenobjekte

ich habe Klasse mit der Bezeichnung Preis

public class Price 
{ 
    public int Id { get; set; } 
    public string DisplayName { get; set; } 
    public double Amount { get; set; } 
    public bool IsActive { get; set; } 

    public int ItemId { get; set; } 
    [ForeignKey("ItemId")] 
    public virtual Item Item { get; set; } 

    public ICollection<PriceOption> PriceOptions { get; set; } 
} 

Und eine ähnliche Klasse mit dem Namen

public class PriceOption 
{ 
    public int Id { get; set; } 


    public int PriceId { get; set; } 
    [ForeignKey("PriceId")] 
    public virtual Price Price { get; set; } 

    public int OptionId { get; set; } 
    [ForeignKey("OptionId")] 
    public virtual Option Option { get; set; } 

} 

Ich habe zwei Suchkriterien

int ItemId 

List<int> optionIds 

Ich möchte einen Lambda-Ausdruck erstellen, um alle Preise zu wählen, die dem ItemId equil sind (leicht) und wo die PriceOptions Sammlung enthält alle die optionIds.

Die Idee ist so etwas, aber natürlich ist es nur um zu zeigen, was ich versuche zu erreichen.

List<Price> prices = _priceRepository.FindAll().Where(x => x.ItemId == item.Id && x.PriceOptions.All(y => y.OptionId == optionIds)).ToList(); 

Vielen Dank für Ihre Hilfe

Earl

+0

Sorry, Die Webseite hat meine Formatierung für die Suchkriterien durcheinander gebracht, aber jetzt habe ich es behoben. Ich muss optionIds verwenden, um dieses Problem zu lösen. Vielen Dank. – earlxtr

Antwort

1

Die Abfrage folgende LINQ basiert auf Contains und Count Methoden erzeugt eine einfachere (und damit letztendlich schneller) SQL-Abfrage:

var matchCount = optionIds.Count; 
var prices = _priceRepository.FindAll() 
       .Where(p => p.ItemId == ItemId && 
        p.PriceOptions.Count(po => optionIds.Contains(po.OptionId)) == matchCount) 
       .ToList(); 
+0

Danke! Ich musste meinen Code verfeinern, aber am Ende funktionierte es wie erwartet ;-) – earlxtr

Verwandte Themen