以下声明有什么问题

Sil*_*ent 2 c# linq linqpad linq-to-sql

这个陈述有什么问题?当在LinqPad中运行语言设置为"C#Statement"时,我得到"; expect".

from p in Products where p.UnitPrice > 50 select new {p.ProductID };
Run Code Online (Sandbox Code Playgroud)

现在好像我将它分配给任何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
Run Code Online (Sandbox Code Playgroud)

编辑:这是我的不好实际上我不能运行第二个例子而不将其分配给变量.

Ani*_*Ani 8

LINQ查询表达式不是C#中的合法语句.您需要在有效语句中使用表达式.

例如,您可以将表达式用作赋值语句的右侧:

var expensiveProductIds = from p in Products
                          where p.UnitPrice > 50 
                          select new { p.ProductID };
Run Code Online (Sandbox Code Playgroud)

在我看来,你似乎并不真正了解LINQ的全部内容.您裸查询表达式的期望是什么?

编辑:看看Alex Moore关于如何在LINQPad中使用它的答案.

顺便说一下,如果你仍然想要坚持使用"C#Statement(s)"模式,这里有一种方法可以将查询结果写入控制台:

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

expensiveProductIds.Dump();
Run Code Online (Sandbox Code Playgroud)

  • @Marc:LINQPad语句模式,就像C#编译器一样,*不*接受试图伪装成语句的查询表达式(通过以分号结尾). (2认同)

Ale*_*ore 6

如果您使用" C#Expression "作为LinqPad语言下拉菜单中的语言,则必须删除分号,因为它只是一个表达式:

from p in Products where p.UnitPrice > 50 select new {p.ProductID }
Run Code Online (Sandbox Code Playgroud)

如果您使用" C#Statement(s) "作为语言,则必须像常规C#代码一样编写它:

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

LINQPad允许您测试两种方式,因为当您将语句放在一边时,一些查询会更容易.