2015-02-03 4 views
0

EDMX использует ICollection для 1: п отношение корабль, как этотEDMX ICollection против DBSet

public partial class Customer 
{ 
    ... 
    public virtual ICollection<User> Users { get; set; } 

ICollection реализует IEnumerable и не IQueryable поэтому используя свойство навигации на клиента для фильтрации сайтов, получить все записи с сервера БД и фильтровать их на стороне клиента (это пример не реальный случай):

var users = myContext.Customer.Users.Where(u.Enabled).FirstOrDefault(); 

Linq запрос:

SELECT [Extent1].[IdCustomer]  AS [IdCustomer], 
     [Extent1].[Enabled]   AS [Enabled], 
     ... 
FROM [Framework].[User] AS [Extent1] 

меня пытаются «заставить» EF установить пользователей в качестве Queryable во время выполнения, но это не работает:

var users = myContext.Customer.Users.AsQueryable().Where(u.Enabled).FirstOrDefault(); 

Два вопроса об этой проблеме:

  • Почему AsQueryable не работает в Это дело ?
  • Почему EDMX использует ICollection, а не DbSet?
  • Возможно ли использовать DbSet или специализированную коллекцию с реализацией IQueryable?

ответ

1

«так используя свойство навигации на клиента для фильтрации сайтов, получить все записи с сервера БД и фильтровать их на стороне клиента»

Это предположение где вы пойдите неправильно. Where() возвращает предикат, который Entity Framework преобразует в SQL-запрос при материализации.

Когда включена функция Lazy Loading, Entity Framework переопределит виртуальное свойство и сделает свою магию на нем, чтобы включить ленивую загрузку.

+0

Извините, но я не понимаю ваш ответ ... В моем примере запрос, сгенерированный linq, не содержит предложение where. – Jerome

Смежные вопросы