MVC 1.0 + EF: db.EntitySet.where(что-то) все еще возвращает все строки в таблице?

В репозитории я делаю это:

public AgenciesDonor FindPrimary(Guid donorId) {
    return db.AgenciesDonorSet.Include("DonorPanels").Include("PriceAdjustments").Include("Donors").First(x => x.Donors.DonorId == donorId && x.IsPrimary);
}

затем в другом методе в том же хранилище, это:

AgenciesDonor oldPrimary = this.FindPrimary(donorId);

В отладчике в окне результатов отображаются все записи в этой таблице, но:

oldPrimary.Count(); 

1 (что и должно быть).

Почему я вижу все записи таблицы, а не только 1? Я думал, что фильтрация строк была сделана в БД.

Если db.EntitySet действительно получает все для клиента, каков правильный способ сохранить клиентские данные облегченными, используя EF? Выборка всех строк не будет соответствовать тому, что я делаю.

2 ответа

Вы увидите все, если наведите курсор на AgenciesDonorSet, потому что LINQ to Entities (или SQL) использует отложенное выполнение. Когда запрос фактически выполняется, он просто получает счетчик.

Если вы хотите просмотреть генерируемый SQL для любого запроса, вы можете добавить этот бит кода:

var query = queryObj as ObjectQuery; //assign your query to queryObj rather than returning it immediately

if (query != null)
{
    System.Diagnostics.Trace.WriteLine(context);
    System.Diagnostics.Trace.WriteLine(query.ToTraceString());
}

Entity Set не реализует IQueryable, поэтому используемые вами методы расширения являются методами расширения IEnumerable. Посмотреть здесь:

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/121ec4e8-ce40-49e0-b715-75a5bd0063dc/

Я согласен, что это глупо, и я удивлен, что больше людей не жаловались на это. Официальная причина:

Причина, по которой проект не делает EntitySet IQueryable, заключается в том, что нет чистого способа согласовать Add\Remove для EntitySet с возможностью фильтрации и преобразования IQueryable.

Другие вопросы по тегам