2010-12-09 6 views
0

Я очень благодарен за подробное объяснение (и если) есть разница в том, что происходит за кулисами следующего фрагмента кода, связанного с Linq to Entities, с учетом этих сценариев:
A. «foreach «цикл был в разделе« using »
B. Вместо Linq to Entites я использовал силимарное отображение, выполняющее запрос Linq to Sql.
C. A + B.
Linq за кулисами

код:

ILookup<string, tblProduct> productBooks; 
     using (TbsDBEntities tbsDbEntities = new TbsDBEntities()) 
     { 
      productBooks = (from tbsDbEntity in tbsDbEntities.tblProducts 
          orderby tbsDbEntity.Title 
          select tbsDbEntity).ToLookup(p => p.Title.Substring(0, 1).ToUpper()); 

     } 


     foreach (IGrouping<string, tblProduct> productBook in productBooks) 
     { 
      if (productBook.Key[0] >= 'A' && productBook.Key[0] <= 'Z') 
      { 
       HtmlAnchor anchor = new HtmlAnchor(); 
       anchor.InnerText = productBook.Key+" "; 
       anchor.HRef ="/"+ productBook.Key; 
       divHeader.Controls.Add(anchor); 
      } 

ответ

0

За кулисами: Код доступа к базе данных список продуктов через отображение субъектов .. обычно один написал бы этот код для структуры ADO.NET Entity + Linq к объектам.

Код использует linq для извлечения строк данных вместо типичных запросов sql, таких как «select * from products». Предполагается, как инструмент, вы сможете увидеть запрос, который код передает серверу sql.

Обычно foreach создает ссылки для каждого продукта, возвращаемого из операторов linq ... и его добавления ссылок внутри. Оператор if, вероятно, защищает код от имен продуктов, которые не начинаются с алфавитного символа. . и поэтому, вероятно, проверка на> = A и < = Z


A. не должно быть разницы.

B. У вас может быть повышенное усиление производительности, если tblProducts имеет множество данных .. потому что linq-to-database поможет избежать создания объектов сущности для всех данных.

C. То же, что B ... потому что я считаю, имея цикл внутри «с помощью» не делает его по-другому

+0

Можете ли вы подробно остановиться на B, пожалуйста? – dortzur 2010-12-09 13:35:04

0

Я смотрел на это тщательно и думал «что не будет работать» после того, как using закрыт.

Однако ToLookup() фактически выполняет выполнение инструкции SQL, так что это все хорошо. Оставляя его как IEnumerable, он будет терпеть неудачу во втором foreach, поскольку контекст будет удален. Linq to SQL будет в порядке с этим кодом.

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