2010-12-23 6 views
0

Entity Framework 4 CTP5 Verwendung Ich habe ein Basismodell und ein basisches DbContext dieWie alle Datensätze zurückgegeben werden und ob ein zugehöriger Datensatz existiert?

public class Customer { 
    public int CustomerId { get; set; } 
    public int Name { get; set; } 
    //... 
    public ICollection<Address> Addresses { get; set; } 
    public bool HasAddress { 
    get { 
     return Addresses.Count > 0; 
    } 
    } 
} 

public class Address { 
    public int AddressId { get; set; } 
    public string StreetLine1 { get; set; } 
    //.... 
    public Customer Customer { get; set; } 
} 

Wie kann ich meine DbContext Abfrage alle Kunden zurück und ob sie eine Adresse funktioniert?

Ein Kunde kann mehrere Adressen haben und ich möchte nicht alle Adressen für jeden Kunden zurückgeben, wenn ich nur daran interessiert bin, ob sie eine Adresse haben oder nicht. Ich benutze context.Customers.Include(c => c.Addresses) aber das gibt alle Adressen für jeden Kunden

Antwort

3

Denken Sie daran, um bestimmen, ob ein Kundenadresse hat, ein Aggregat Betrieb (COUNT) muss auf dem Server durchgeführt werden. Ich glaube nicht, dass Sie diese -Eigenschaft direkt im LINQ-Prädikat verwenden können, da AFAIK-Aggregatoperationen nicht in LINQ-Entities-Prädikaten verwendet werden können.

So könnte man so etwas zu tun haben:

var result = ctx.Customers.Select(x => new 
            { 
            Customer = x, 
            HasAddress = x.Addresses.Count() > 0 
            }).ToList(); 

die eine Sammlung von anonyme Typen, einschließlich alle Kunden zurück, und ob sie mindestens eine Adresse.

Beachten Sie die () auf der Anzahl - das führt eine tatsächliche Aggregatoperation - während .Count eine clientseitige LINQ-Operation ist.

HTH.

EDIT

Wenn Sie diesen anonymen Typ zurück in ein Customer-Objekt setzen möchten, können Sie dies nach tun die Abfrage zustande gekommen ist (zB die Gewährleistung der .Count() auf der Datenbank durchgeführt wurde):

var result = ctx.Customers.Select(x => new 
             { 
             Customer = x, 
             HasAddress = x.Addresses.Count() > 0 
             }).ToList() 
             .Select(x => new Customer 
             { 
             // left to right copy.... 
             HasAddress = true 
             }).ToList(); 

Was ist ziemlich dreckig IMO, aber es wird funktionieren.

+0

Danke, gibt es sowieso, um die x.Addresses.Count()> 0 in eine HasAddress-Eigenschaft des Customer-Objekts zu projizieren? Ich möchte mein Modell sauber halten und der zusätzliche anonyme Typ ist wie ein View-Modell –

+0

Sie können Ihr Eigentum behalten, wie es ist - mit '.Count' (kein'() '), aber es wird ein Client sein- Seitenoperation auf der Sequenz (zB nachdem die Abfrage ausgeführt wurde). Sie werden es nur nicht wie erwähnt in dem Prädikat verwenden können. Und ja - projizieren Sie auf jeden Fall in eine andere Klasse/Typ, wenn das passt. – RPM1984

+0

Ich habe eine Bearbeitung hinzugefügt, um zu zeigen, wie Sie es wieder in das Customer-Objekt einfügen können. Aber es ist ziemlich dreckig. Ich kenne keinen besseren Weg. – RPM1984

Verwandte Themen