Какво не е наред с това твърдение по-долу

Какво не е наред с това твърдение по-долу? Получавам "; очаква се", когато го стартирам в LinqPad с езикова настройка на "C# Statement".

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

Сега изглежда, че ако го присвоя на произволна var; Не получавам никаква грешка. Но това, което намирам за объркващо, е, че изразът по-долу работи добре и ми връща резултати, въпреки че не го присвоявам на никоя променлива. Някакви идеи?

    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

РЕДАКТИРАНЕ: Грешката ми беше всъщност, че не можах да стартирам втория пример, без да го присвоя на променлива.


person Silverlight Student    schedule 04.11.2011    source източник
comment
Можете ли да публикувате останалата част от кода, моля?   -  person MGZero    schedule 04.11.2011
comment
Кодът в приложение ли е или всъщност използвате LINQ Pad (видях етикета linqpad... може да има значение)?   -  person Justin Niessner    schedule 04.11.2011
comment
Каква е вашата езикова настройка в LINQPad?   -  person mwilson    schedule 04.11.2011
comment
актуализиран въпрос с повече подробности   -  person Silverlight Student    schedule 04.11.2011
comment
Ако сте в езиков режим C# Expression, трябва да изпуснете точката и запетая в първия си пример. Вижте публикацията ми по-долу.   -  person Alex Moore    schedule 04.11.2011
comment
Взимам '; очаквано“, ако се опитам да изпълня втория пример като израз на C#.   -  person Alex Moore    schedule 04.11.2011
comment
Каква версия на LINQPad използвате? 4.31 Безплатна версия?   -  person Alex Moore    schedule 04.11.2011
comment
@Alex: Да, безплатната версия е 4.31   -  person Silverlight Student    schedule 04.11.2011


Отговори (7)


Изразите на 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();
person Ani    schedule 04.11.2011
comment
LINQPAD има режим Expression, който изпълнява изрази точно както ги е написал (без точката и запетая в края). Предполагам, че така е очаквал да работи. - person Marc; 04.11.2011
comment
Той/тя изпробва израза в LINQPad, а не в C# като израз. - person Alex Moore; 04.11.2011
comment
LINQPAD има комбинация от езици, избрах c# statment от там. Само за да бъде ясно, има друга опция C# Expression, но това НЕ е това, което използвам в този случай. - person Silverlight Student; 04.11.2011
comment
@Marc: Режимът на изявление на LINQPad, точно като компилатора на C#, не приема изрази на заявки, които се опитват да се маскират като изрази (като ги завършва с точка и запетая). - person Ani; 04.11.2011
comment
@Ani: Да, вярно е, че съм напълно нов в Linq и се боря да премина през първоначалната гърбица. Благодаря за вашата помощ. - person Silverlight Student; 04.11.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 ви позволява да тествате и по двата начина, защото някои заявки са по-лесни, когато премахнете изразите от пътя.

person Alex Moore    schedule 04.11.2011
comment
Добавих въпросен пример, където мога да го стартирам като C# израз, без да го присвоявам обратно на променлива - person Silverlight Student; 04.11.2011
comment
Взимам '; очаквано“, ако се опитам да изпълня втория пример като израз на C#. - person Alex Moore; 04.11.2011

Опитайте да присвоите резултата на променлива.

var v = from p in Products where p.UnitPrice > 50 select new {p.ProductID }; 
person Purplegoldfish    schedule 04.11.2011

Вашият код не е валиден израз на C#.

Или присвоете стойността на вашия израз на променлива:

var q = from p in ... ;

Или премахнете точката и запетая в края и сменете езика на C# Expression

person Jan    schedule 04.11.2011

Трябва да го присвоите на нещо.

var productIds = from p in Products where p.UnitPrice > 50 select new {p.ProductID };
person Adam Barney    schedule 04.11.2011

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

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

РЕДАКТИРАНЕ: Поради коментарите разбирам, че това няма да предостави нищо полезно за решаване на проблема на OP.

person Cᴏʀʏ    schedule 04.11.2011
comment
Не е необходимо да указвате име на свойство, ако присвоявате поле или свойство и все още искате това име. Наистина много удобно! - person leppie; 04.11.2011
comment
new { p.ProductID } и new { ProductID = p.ProductID } ще създадат един и същ анонимен тип. - person cadrell0; 04.11.2011
comment
@cadrell0: Не знаех това (актуализирах отговора си)! Предполагам, че винаги обичам да бъда откровен с тези проклети анонимни типове :) - person Cᴏʀʏ; 04.11.2011
comment
Преди винаги бях ясен, след това взех ReSharper и започна да ми се кара. - person cadrell0; 04.11.2011

опитвате се да изберете, след като сте го присвоили така. така че трябва да използвате нещо като това

from p in Products where p.UnitPrice > 50 select 
                                                new { 
                                                      ProductID = p.ProductID 
                                                    };
person Hari Gillala    schedule 04.11.2011
comment
Това е същият код, освен че имате някои нови редове. И излишно име на свойство във вашия анонимен тип. - person cadrell0; 04.11.2011