2012-03-31 4 views
0

Meine EF Objektabfrage ist:mit Join mit Entity-Framework-Objektabfrage. Navigationseigenschaft noch zeigt alle Einheiten des verbundenen Unternehmens

from customer in MCDBContext.Customers 
join customerCase in MCDBContext.CustomerCases on customer.CustomerID equals customerCase.CustomerID 
join customerCasePhone in MCDBContext.CustomerCasePhones on customerCase.CustomerCaseID equals customerCasePhone.CustomerCaseID 
**join customerCaseAddress in MCDBContext.CustomerCaseAddresses on customerCase.CustomerCaseID equals customerCaseAddress.CustomerCaseID** 

where customer.CustomerPIN.Equals(pin, StringComparison.InvariantCultureIgnoreCase) && 
     customerCasePhone.PhoneNumber.Equals(phoneNumber, StringComparison.InvariantCultureIgnoreCase) && 
     **customerCaseAddress.AddressTypeID == 6** && 
     customerCase.IsActive == true && customerCasePhone.IsActive == true && customerCaseAddress.Active == true && customer.IsActive == true 
select customer; 

Im Code:

var customers = getmethod() //calls the above object query method. 

wenn ich jetzt tun customers.First().CustomerAddresses(); // Gibt alle Kundenadressen, obwohl ich es gefiltert habe, nur um TypeID = 6 in meiner Objektabfrage zu tun. Warum? Ich möchte die Filterbedingung nicht erneut schreiben. Irgendwelche Ideen?

Danke.

Antwort

1

Ihre Abfrage gibt nicht alle Adressen pro Kunde zurück. Es gibt keine Adresse zurück. Die Adressen werden später geladen, wenn Sie auf die Navigationseigenschaften zugreifen. Das ist eine zweite Abfrage und Lazy Loading gibt immer alle Adressen zurück.

Wenn Sie das gewünschte Ergebnis in einer einzigen Datenbankabfrage erhalten möchten, benötigen Sie eine Projektion, um Kunden-UND-Adressen in der select Operation zu laden.

Die Nutzung Ihrer Navigationseigenschaften (ich glaube, Sie haben einige, weil der Tag unter Ihrer Frage), es würde wie folgt aussehen:

var result = MCDBContext.Customers 
    .Where(customer => customer.IsActive && customer.CustomerPIN.Equals(
      pin, StringComparison.InvariantCultureIgnoreCase) 
     && customer.CustomerCases.Any(ccase => 
       ccase.IsActive 
      && ccase.CustomerCasePhones.Any(phone => 
        phone.IsActive 
       && phone.PhoneNumber.Equals(
        phoneNumber, StringComparison.InvariantCultureIgnoreCase)) 
      && ccase.CustomerCaseAddresses.Any(address => 
        address.IsActive 
       && address.AddressTypeID == 6))) 
    .Select(customer => new 
    { 
     Customer = customer, 
     // you can also fetch here cases and phones, if you need them 
     Addresses = customer.CustomerCases.Where(ccase => ccase.IsActive) 
      .Select(ccase => ccase.CustomerCaseAddresses 
       .Where(address => address.IsActive && address.AddressTypeID == 6)) 
    }) 
    .ToList(); 

Dies gilt bevölkern nicht die Adressen Sammlung im Objektbaum von Kunde gibt aber nur eine Liste von anonymen Objekten zurück: Jeder Eintrag hat den Kunden und die gefilterten Adressen dieses Kunden.

+0

Cool, danke! Das hat die Dinge sehr deutlich gemacht. Ich würde mit Lazy Loading gehen und meine Filterung dort vornehmen, anstatt mich mit den anonymen Sammlungsobjekten zu beschäftigen. –