2009-11-17 3 views
0

В хранилище, я делаю это: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); 

В отладчике, то resultsview показывает все записи в этой таблице, но :

oldPrimary.Count(); 

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

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

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

ответ

0

Вы увидите все, если наведите указатель мыши на 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()); 
} 
+0

Но почему запрос всегда возвращал все строки в таблице, когда имеется только одна строка, соответствующая предикатам lamba? Это то, что меня беспокоит. Почти так же, как EntitySet, копирует всю таблицу в EF, а затем EF каким-то образом фильтрует вне базы данных. Это не будет работать для моих нужд, так как у меня есть тысячи строк. – Dale

+1

Вы вызываете утверждение в отладчике, которое не отражает то, что на самом деле происходит в коде. Когда код выполняется, из базы данных будет извлекаться только одна строка. – mkedobbs

0

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

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

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

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