2016-07-07 23 views
2

Guten Tag,C# Linq-Abfrage Filter Kind Sammlung

Ich habe eine Modellklasse wie unten

public class EmployeeModel 
    { 
     [Key] 
    public int employeeId{get;set;} 
    public string Fullname {get;set;} 
    public string Address{get;set;} 
    public ICollection<PaymentModel> Payments {get;set;} 
    } 


    public class PaymentModel 
    { 

     [Key] 
    public int PaymentId{get; set;} 
    public int employeeId{get; set;} 
    public decimal PaymentAmount{get; set;} 
     public int IsPosted {get; set;} 
     public virtual EmployeeModel Employee {get; set;} 

    } 

Ich möchte nur die Liste der Mitarbeiter abgefragt werden zusammen mit ihrer Liste der Zahlungen mit Linq. also ich Code wie folgt:

diese Auflistung zeigen alle Mitarbeiter und alle ihre Zahlungen. aber ich muss jeden Mitarbeiter filtern Zahlungen, die IsPosted = 1

so als erste Antwort, diesen Code tun;

dbcontext db = new dbcontext(); 
List<EmployeeModel> FinalList = new List<EmployeeModel>(); 
var listingofEmp = db.employee.ToList(); 

foreach(EmployeeModel emp in listingofEmp){ 
emp.Payments= db.payments.where(x => x.IsPosted == 1).ToList(); 
FinalList.Add(emp); 
} 

meine Frage ist, gibt es einen anderen Weg, es viel einfacher zu codieren? etwas wie das.

dbcontext db = new dbcontext(); 
    var listing = from d in db.Employees 
        .include(d => x.Payments.IsPosted == 1) 
        select d; 

im mit curently EntityFramework 5

ive Forschung in Bezug auf das für mich mir nicht funktioniert Link

Hoffnung jemand helfen

Dank im Voraus Jungs

Antwort

3

Was Sie fordern ist nicht nativ unterstützt, so gibt es keinen einfacheren Weg, aber für sicher, es ist effizienter, weil Ihr aktueller Code N + 1 Datenbankabfrage durchführt.

Ein besserer Weg könnte sein, Mitarbeiter und zugehörige gefilterte Zahlungen mit einer Datenbankabfrage unter Verwendung der anonymen Typ-Projektion abzurufen und dann etwas Ähnliches wie Ihren Ansatz zu machen, um das Endergebnis im Speicher zu erstellen. Zum Beispiel:

var listing = 
    db.Employees.Select(employee => new 
    { 
     employee, 
     payments = employee.Payments.Where(p => p.IsPosted == 1) 
    }) 
    .AsEnumerable() // Switch to LINQ to Objects 
    .Select(r => 
    { 
     r.employee.Payments = r.payments.ToList(); 
     return r.employee; 
    }) 
    .ToList(); 
+0

Es funktioniert wie ein Charme .. !!! Danke für die Unterstützung von Sir Ivan .. Sir ivan kann ich fragen, wo ich mehr in linq lernen kann? irgendwelche Links oder Bücher? Ich hoffe, von Ihnen zu hören Herr BITTE; (... – Neil

+0

Hallo Neil, ich weiß wirklich nicht, was ich dir vorschlagen soll. Ich bin mir sicher, dass es für LINQ viele gute Bücher/Links gibt, aber ich persönlich habe alles aus MSDN-Themen gelernt und hauptsächlich experimentiert. Beachten Sie, dass verschiedene LINQ-Implementierungen Besonderheiten aufweisen, so dass das obige Beispiel für den neuesten EF Core gelten kann oder auch nicht. –

+0

Gibt es eine gleichwertige Möglichkeit, dies mit linq in ef6 zu tun? Ich habe die gleiche Logik in ef6 versucht, aber es filtert die Kind-Sammlung nicht. – overloading

1

es sein colud gute Alternative

(nicht getestet, dann bitte Fehler beheben)

Start von pyaments, Filter für = 1 gebucht wird, dann wählen Sie im Zusammenhang emplyees

+0

Dank für die sofortige answere @Danilo Calzetta .. werde ich mit diesem versuchen: D – Neil

+0

Hallo Sir @Danilo Calzetta, ist es eine andere Möglichkeit? Ich muss die Liste des Angestellten dann den Unterbericht seiner Zahlungen binden. dieser Weg wird schwieriger sein, weil ich jede Zahlung Schleife zu einer einzigen Liste gruppieren muss .. so kann ich es an Listenansicht meiner WPF UI binden. . – Neil

+0

@Neil bitte schauen Sie sich meine Beispielabfrage an, sie gibt genau eine Liste von Mitarbeitern zurück, becouse wählt "d.emplyees" und nicht "d" –

0

so etwas wie diese versuchen: Es wird Ihnen eine Liste von anonymen Typ, der den Mitarbeiter und seine Zahlungen enthält.

using (dbcontext ctx = new dbcontext()) 
{ 
    ctx.Connection.Open(); 

    var result = (from e in ctx.Employees 
        join p in ctx.Payments on e.employeeId equals p.employeeId 
        where p.IsPosted == 1 
        select new 
        { 
         Employee = e, 
         Payments = p 
        }).ToList(); 

    ctx.Connection.Close(); 
} 
+0

hi @Paul ich werde das versuchen .. danke für Ihren Kommentar – Neil

+0

hi @Paul wie Kann ich das Ergebnis nutzen? Ich möchte es in Liste der Mitarbeiter kapseln, damit ich es an meine WPF UI binden kann .. Sorry für noob Frage – Neil