2016-06-30 25 views
3

Ich versuche, Ergebnisse für Benutzeranforderung zu filtern. Zum Beispiel haben Sie orders und order details und products ist Kinderkollektion.Wie filter Kind Sammlung mit Linq dynamische

Wenn Benutzer mögen von Produkt filtern Ich erhalte eine Fehlermeldung wegen No property or field 'PRODUCTS' exists in type 'ICollection 1'`

ich meine Abfrage wie folgt zu schreiben.

var orders = _uow.Repository<ORDERS>() 
    .Query() 
    .Where("PRODUCTS.HEADING.ToLower().Contains(\"foo\")") 
    .Include("ORDER_DETAILS") 
    .Include("ORDER_DETAILS.PRODUCTS") 
    .ToList(); 

So ist es nicht möglich, Kinderkollektion so zu filtern? Oder irgendeine Art zu filtern?

Danke.

+0

Sie müssen nicht tun .Inculde ("ORDER_DETAILS"), es ist genug zu tun. Include ("ORDER_DETAILS.PRODUCTS"). Sie können versuchen, ohne die .Include ("ORDER_DETAILS") Zeile und sehen, was passiert. – meJustAndrew

+0

Reihenfolge der Tabellen wie ORDERS -> ORDER_DETAILS -> PRODUCTS. Also muss ich ORDER_DETAILS einschließen, weil das productID enthält. – Kadir

+0

Ich verstehe, aber freuen Sie sich [msdn Beispiele] (https://msdn.microsoft.com/en-us/library/bb738708 (v = vs.110) .aspx), sie sagen, dass in Ihrem Fall B. ORDER_DETAILS, wenn Sie nur .Include ("ORDER_DETAILS.PRODUCTS") verwenden. – meJustAndrew

Antwort

1

Aus der Art, wie Sie Ihre Klassen/Eigenschaften benannt haben, ist es schwer zu erraten, welches ein einzelnes Objekt ist und welches eine Auflistungseigenschaft ist.

Wenn ORDERS Klasse Eigenschaft ORDER_DETAILS ist eine Sammlung von ORDER_DETAILS Klasse und ORDER_DETAILS Klasse Eigenschaft PRODUCTS ist ein Seng Objekt von PRODUCTS Klasse eine String-Eigenschaft mit HEADINGS, dann die folgenden sollte es tun:

.Where("ORDER_DETAILS.Any(PRODUCTS.HEADING.ToLower().Contains(\"foo\"))") 

Es ist im Grunde das gleiche wie statische Abfrage mit Lambda-Parameter übersprungen

.Where(o => o.ORDER_DETAILS.Any(d => d.PRODUCTS.HEADING.ToLower().Contains("foo"))) 
+0

Super, vielen Dank. Ich war nicht bewusst, dass es so einfach ist, Entity Framework Any Expression mit Linq Dynamic zu verwenden. – Kadir

+0

Schnelle Frage, kann ich wo Bedingung mit Bestellung von auch verwenden? Ist die Nutzung gleich? – Kadir

+0

Ich denke schon, aber nicht 100% sicher. Es ist Versuch und Irrtum Erfahrung, weißt du :) –

0

Das Problem ist, dass ORDER_DETAILS eine Liste ist, und jedes Bestelldetail hat eine Produktliste? Deshalb erhalten Sie die Fehlermeldung. Um Produkte von ORDER_DETAILS zu erhalten, müssen Sie sie durchlaufen und die Produkte von jedem Element abrufen.

können Sie versuchen:

var orders = _uow.Repository<ORDERS>() 
    .Query() 
    .Where("PRODUCTS.HEADING.ToLower().Contains(\"foo\")") 
    .Include(x=>x.ORDER_DETAILS.Select(y => y.PRODUCTS)); 

Es ist wie jetzt scheint das Problem in this question beschrieben haben. Hoffe, es funktioniert jetzt gut.

+0

Ich denke, ich habe hier eine Lösung gefunden. http://stackoverflow.com/questions/22672050/dynamic-expression-tree-to-filter-on-nested-collection-properties. Aber immer noch daran arbeiten. – Kadir

+0

@Kadir Ich habe meine Antwort aktualisiert, hoffe, es funktioniert – meJustAndrew

+0

Sorry für späte Antwort (es war Urlaub in meinem Land). Also können wir Ihre Lösung nicht wirklich machen, da in foreach loop order das eigentliche Item ist. Wir können dort die Include-Methode oder die Linq-Funktion nicht verwenden. Btw diese Unitofwork gibt IQerable zurück. – Kadir