Линк за кадром - PullRequest
       23

Линк за кадром

0 голосов
/ 09 декабря 2010

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

код:

 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);
            }

Ответы [ 2 ]

0 голосов
/ 09 декабря 2010

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

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

0 голосов
/ 09 декабря 2010

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

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

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


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

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

C. То же, что и B ... потому что я считаю, что цикл for внутри 'using' не делает его другим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...