синтаксис linq to sql отличается, но должен получить те же результаты - PullRequest
2 голосов
/ 13 января 2010

Я играл с деревьями выражений и различным синтаксисом Linq.Я написал следующее:

using (NorthwindDataContext DB = new NorthwindDataContext())
        {
            DataLoadOptions dlo = new DataLoadOptions();

            // Version 1
            dlo.AssociateWith<Customer>(c => c.Orders.Where(o => o.OrderID < 10700).Select(o => o)); 

            // Version 2
            dlo.AssociateWith<Customer>(c => from o in c.Orders
                                             where o.OrderID < 10700
                                             select o);
        }

Метод версии 1 возвращает сообщение об ошибке «Оператор« Выбор »не поддерживается в подзапросе».

Хотя версия 2 работает нормально.Из того, что я понимаю, я пишу точно то же самое, но один с синтаксисом «точка», а другой - синтаксис выражения запроса.

Я что-то здесь упускаю?Почему ошибки одного, а не другого «если» на самом деле являются одним и тем же запросом?

Ответы [ 2 ]

7 голосов
/ 13 января 2010

Чтобы расширить ответ Даниэля, select o известен как вырожденное выражение запроса - и он удаляется компилятором C #. Итак, ваш запрос переведен на:

c.Orders.Where(o => o.OrderID < 10700)

Обратите внимание, что без предложения where, однако, компилятор будет по-прежнему включать вызов Select, поэтому:

from o in c.Orders
select o

переводится как

c.Orders.Select(o => o)

Из раздела 7.15.2.3 спецификации языка:

Вырожденное выражение запроса - это одно который тривиально выбирает элементы источник. Поздняя фаза перевод удаляет вырожденные запросы введены другими шагами перевода заменив их источником. Однако важно убедиться, что результат выражения запроса никогда сам исходный объект, как что бы раскрыть тип и личность источника для клиента запроса. Поэтому этот шаг защищает вырожденные запросы, написанные прямо в исходном коде явно звонить Select по источнику. это затем до исполнителей Select и другие операторы запросов для обеспечения что эти методы никогда не возвращают сам исходный объект.

7 голосов
/ 13 января 2010

Вам не нужно .Select(o => o) в вашем запросе.

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