2017-10-02 3 views
3

Ich möchte eine Abfrage mit EF Core ausführen, wo ich nach einer untergeordneten Entität filtern und auch Paging anwenden muss. Siehe mein (Beispiel) Datenmodell unten: Data Model Ich möchte alle Daten (Kunden, Bestellungen, Bestellinformationen und Produkte) abrufen. Ich habe einen Filter auf Order.OrderState anzuwenden und ich möchte nur die ersten 10 Einträge (Kunden)EF Core-Filterung + Paging mit untergeordneten Entitäten

Dies ist die LINQ-Abfrage Ich habe versucht:

var customers = await _ctx.Customer 
      .Include(c => c.Order.Where(o => o.OrderState == 0)) 
      .ThenInclude(o => o.OrderDetail) 
      .ThenInclude(d => d.Product) 
      .Skip(0).Take(10) 
      .ToListAsync(); 

Bei der Ausführung dieser Abfrage ich die folgende Fehlermeldung erhalten: InvalidOperationException: Der Property-Ausdruck 'c => {von Order o in c.Order wo ([o] .OrderState == 0) select [o]}' ist nicht gültig. Der Ausdruck sollte einen Eigenschaftenzugriff darstellen: 't => t.MyProperty'. Weitere Informationen zu verwandten Daten einschließlich

Also habe ich versucht, eine weitere Abfrage:

var qry = from c in _ctx.Customer 
        join o in _ctx.Order on c.Id equals o.CustomerId 
        join d in _ctx.OrderDetail on o.Id equals d.OrderId 
        join p in _ctx.Product on d.ProductId equals p.Id 
        where o.OrderState == 0 
        select new { Customer = c, Order = o, OrderDetail = d, Product = p }; 
     var customers = await qry.Skip(0).Take(10).ToListAsync(); 

Jetzt ist die Abfrage einen Fehler nicht erzeugen, aber das Ergebnis ist nicht das, was ich will. Aufgrund der 1-n-Beziehungen gibt diese Abfrage Kunden mehrfach im Ergebnis zurück, sodass ich die ersten 10 Kunden nicht erhalte.

Hat jemand eine bessere Abfrage, um die Ergebnisse zu erhalten, die ich will?

Antwort

0

Ich denke, Sie können ".Distinct()" beim Erstellen der Abfrage verwenden. Hoffe, das wird das Problem lösen.

var qry = (from c in _ctx.Customer 
         join o in _ctx.Order on c.Id equals o.CustomerId 
         join d in _ctx.OrderDetail on o.Id equals d.OrderId 
         join p in _ctx.Product on d.ProductId equals p.Id 
         where o.OrderState == 0 
        select new { Customer = c, Order = o, OrderDetail = d, 
         Product = p }).Distinct(); 

var customers = await qry.Skip(0).Take(10).ToListAsync(); 
+0

Dank Muhammad. Das Distinct wird auf die ganze Reihe angewendet, also Kunde, Auftrag, etc. Es sollte nur den Kunden unterscheiden, um das Ergebnis zu erhalten, das ich will, aber das ist nicht der Fall. – dennieku

Verwandte Themen