используя соединение с запросом объекта каркаса сущности.Свойство навигации по-прежнему отображает все объекты присоединенного объекта - PullRequest
0 голосов
/ 31 марта 2012

Мой объектный запрос EF:

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;

В коде:

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

теперь, когда я делаю customers.First().CustomerAddresses(); // Возвращает все адреса клиентов, хотя я отфильтровал его, чтобы сделать только TypeID = 6 в моем объектном запросе. Почему так? Я не хочу писать условие фильтра снова. Есть идеи?

Спасибо.

1 Ответ

1 голос
/ 31 марта 2012

Ваш запрос не возвращает всех адресов на одного клиента. Он не возвращает никакого адреса вообще. Адреса загружаются впоследствии из-за отложенной загрузки при доступе к свойствам навигации. Это второй запрос, и отложенная загрузка всегда возвращает все адреса.

Если вы хотите получить желаемый результат в одном запросе к базе данных, вам нужен прогноз для загрузки адресов клиентов и AND в операции select.

Используя ваши свойства навигации (я думаю, у вас есть некоторые из-за тега под вашим вопросом), это будет выглядеть так:

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();

Это не заполняет коллекцию адресов в дереве объектов клиента, а только возвращает список анонимных объектов: у каждой записи есть клиент и отфильтрованные адреса этого клиента.

...