Могу ли я загрузить иерархические данные в Entity Framework 4 с помощью «.Include» и отфильтровать свойство навигации на основе некоторых критериев - PullRequest
2 голосов
/ 19 января 2011

Здравствуйте! Я использую Entity Framework 4 и пытаюсь запрашивать клиентов и их заказы. как свойство навигации, но я хочу загружать заказы только на определенную дату.

При использовании этого:

List<Customer> CustomerResults = ctx.Customers
.Include("Orders") 
.Where(
       c =>
       c.Orders.Any(od =>(od.DateTimeIn >= this.StartDateComboBox.DateTime && 
       od.DateTimeIn <= this.EndDateComboBox.DateTime))
      );

Я получаю все Заказы, если какой-либо из них соответствует критериям.

Можно ли отфильтровать свойство навигации, чтобы оно возвращало только те строки, которые соответствуют определенным критериям?

1 Ответ

7 голосов
/ 19 января 2011

Нет, нет.

Короче говоря, активная загрузка с помощью Include автоматически загружает все связанные записи (например, ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ без фильтра).

В любое время, когда вы хотите отфильтровать связанные записи, не используйте Include - используйте проекцию анонимного типа, и EF просто "решит", что нужно извлечь:

var CustomerResults = ctx.Customers 
                         .Select(x => new
                         {
                            Customer = x,
                            Orders = x.Orders.Where(y => y.DateTimeIn > value)
                         }).ToList();

Если вы хотите вернуть Customer сущность, то просто сделайте другую проекцию в конце, просто убедитесь, что вы сначала материализовали запрос (.ToList()).

РЕДАКТИРОВАТЬ - для возврата в объект клиента, например:

var Customers = new List<Customer>();
foreach (var anonType in CustomerResults)
{
   Customer c = anonType.Customer;
   c.Orders = anonType.Orders;
   Customers.Add(c);
}

Я уверен, что вы можете сделать это с помощью выражения LINQ, но я не могу вспомнить синтаксис.

...