MVC 1.0 + EF: db.EntitySet.where (что-то) все еще возвращает все строки в таблице? - PullRequest
0 голосов
/ 18 ноября 2009

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

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 ]

0 голосов
/ 10 января 2011

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

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

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

дизайн причина не делать EntitySet IQueryable потому что нет чистого способа примирить Добавить \ Удалить на EntitySet с IQueryable фильтрации и способность к трансформации.

0 голосов
/ 18 ноября 2009

Вы увидите все, если наведите курсор на 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());
}
...