Что не так с этим утверждением ниже - PullRequest
2 голосов
/ 04 ноября 2011

Что не так с этим комментарием ниже? Я получаю «; ожидается», когда запускаю его в LinqPad с настройкой языка «C # Statement».

from p in Products where p.UnitPrice > 50 select new {p.ProductID };

Теперь, похоже, если я назначу его на любую переменную; Я не получаю никакой ошибки. Но то, что я нахожу сбивающим с толку, так это то, что приведенное ниже утверждение прекрасно работает и возвращает результаты, хотя я не назначаю его ни одной переменной. Есть идеи?

    from p in Products
let spanishOrders = p.OrderDetails.Where ( o=> o.Order.ShipCountry == "Spain")
where spanishOrders.Any()
group new
{
    p.ProductName,
    Orders = spanishOrders.Count(),
    spanishOrders
}
by p.Category.CategoryName

РЕДАКТИРОВАТЬ: На самом деле это было плохо, я не мог запустить второй пример, не присвоив его переменной.

Ответы [ 8 ]

8 голосов
/ 04 ноября 2011

LINQ Query выражения не являются допустимыми утверждениями в C #. Вам нужно использовать выражение в допустимом выражении.

Например, вы можете использовать выражение в качестве правой части оператора присваивания:

var expensiveProductIds = from p in Products
                          where p.UnitPrice > 50 
                          select new { p.ProductID };

Мне кажется, ты не понимаешь, что такое LINQ. Что вы ожидали от выражения вашего голого запроса?

РЕДАКТИРОВАТЬ : взгляните на ответ Алекса Мура о том, как заставить это работать в LINQPad.

Кстати, вот способ получить результаты запроса, записанные в консоль, если вы все еще хотите придерживаться режима «C # Statement (s)»:

var expensiveProductIds = from p in Products
                          where p.UnitPrice > 50 
                          select new { p.ProductID };

expensiveProductIds.Dump();
6 голосов
/ 04 ноября 2011

Если вы используете « C # Expression » в качестве языка в выпадающем меню языка LinqPad, вам нужно отбросить точку с запятой, потому что это просто выражение:

from p in Products where p.UnitPrice > 50 select new {p.ProductID }

Если вы используете " C # Statement (s) " в качестве языка, вам придется записать его как обычный код C #:

var x = (from p in Products where p.UnitPrice > 50 select new {p.ProductID });

LINQPad позволяет тестировать оба способа, потому чтонекоторые запросы упрощаются, когда вы убираете утверждения.

1 голос
/ 04 ноября 2011
            var db = new DataContext();
            var product= from p in db.Products 
                          where p.UnitPrice > 50
                          select new{ProductId = p.ProductID };
0 голосов
/ 04 ноября 2011

Вам нужно присвоить это чему-либо.

var productIds = from p in Products where p.UnitPrice > 50 select new {p.ProductID };
0 голосов
/ 04 ноября 2011

Ваш код не является допустимым оператором C #.

Либо присвойте значение вашего выражения переменной:

var q = from p in ... ;

Или удалите точку с запятой в конце и измените язык на C # Выражение

0 голосов
/ 04 ноября 2011

Попробуйте присвоить результат переменной.

var v = from p in Products where p.UnitPrice > 50 select new {p.ProductID }; 
0 голосов
/ 04 ноября 2011

вы пытаетесь выбрать после того, как он назначен так. поэтому вы должны использовать что-то вроде этого

from p in Products where p.UnitPrice > 50 select 
                                                new { 
                                                      ProductID = p.ProductID 
                                                    };
0 голосов
/ 04 ноября 2011

Единственное, что мне кажется странным, это то, что в вашем новом анонимном объекте вы не присваиваете ProductID свойству, но я полагаю, что это не обязательно (я только что попробовал).

from p in Products where p.UnitPrice > 50 select new { ProductID = p.ProductID };

РЕДАКТИРОВАТЬ : Из-за комментариев я понимаю, что это не даст ничего полезного для решения проблемы ОП.

...