【问题标题】:What is wrong with this statement below下面这句话有什么问题
【发布时间】:2011-11-04 15:02:51
【问题描述】:

下面这句话有什么问题?在 LinqPad 中运行语言设置为“C# 语句”时,我得到“;预期”。

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

编辑:实际上我无法运行第二个示例而不将其分配给变量。

【问题讨论】:

  • 请把剩下的代码贴出来好吗?
  • 代码是在应用程序中,还是您实际上在使用 LINQ Pad(看到 linqpad 标记...它可以有所作为)?
  • 您在 LINQPad 中的语言设置是什么?
  • 更新了更多细节的问题
  • 如果您处于“C# 表达式”语言模式,则必须在第一个示例中删除分号。请参阅下面的帖子。

标签: c# linq linq-to-sql linqpad


【解决方案1】:

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

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

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

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

编辑:看看 Alex Moore 的回答,了解如何让它在 LINQPad 中工作。

顺便说一句,如果您仍想坚持“C# Statement(s)”模式,这里有一种方法可以将查询结果写入控制台:

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

expensiveProductIds.Dump();

【讨论】:

  • LINQPAD 有一个模式,Expression,它按照他写的方式执行语句(减去结尾的分号)。我假设这就是她/他期望它的工作方式。
  • 他/她正在尝试 LINQPad 中的表达式,而不是 C# 中的语句。
  • LINQPAD 有一个语言组合,我从那里选择了“c# statment”。为了清楚起见,还有另一个选项“C# 表达式”,但这不是我在这种情况下使用的。
  • @Marc:LINQPad 语句模式,就像 C# 编译器一样,not 接受试图伪装成语句的查询表达式(以分号结尾)。
  • @Ani:是的,这是真的,我对 Linq 完全陌生,正在努力度过最初的坎。感谢您的帮助。
【解决方案2】:

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

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 允许您测试两种方式,因为当您将语句排除在外时,某些查询会更容易。

【讨论】:

  • 我添加了一个有问题的示例,我可以将其作为“C# 语句”运行,而无需将其分配回 var
  • 我得到 ';如果我尝试将第二个示例作为 C# 语句运行。
【解决方案3】:
            var db = new DataContext();
            var product= from p in db.Products 
                          where p.UnitPrice > 50
                          select new{ProductId = p.ProductID };

【讨论】:

    【解决方案4】:

    尝试将结果分配给变量。

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

    【讨论】:

      【解决方案5】:

      您的代码不是有效的 C# 语句。

      将表达式的值分配给变量:

      var q = from p in ... ;
      

      或者去掉末尾的分号,把Language改成C# Expression

      【讨论】:

        【解决方案6】:

        你需要把它分配给某个东西。

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

        【讨论】:

          【解决方案7】:

          对我来说唯一看起来很奇怪的是,在您的新匿名对象中,您没有将 ProductID 分配给属性,但我想这并不是真正需要的(我只是尝试过)。

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

          编辑:由于 cmets,我意识到这不会为解决 OP 的问题提供任何有用的东西。

          【讨论】:

          • 如果您正在分配字段或属性,则不需要指定属性名称,并且您仍然需要该名称。确实很方便!
          • new { p.ProductID }new { ProductID = p.ProductID } 将产生相同的匿名类型。
          • @cadrell0:不知道(更新了我的答案)!我想我总是喜欢明确那些该死的匿名类型:)
          • 我以前总是直言不讳,后来我得到了 ReSharper,它开始骂我。
          【解决方案8】:

          您在分配 so 后尝试选择。所以你应该使用这样的东西

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

          【讨论】:

          • 除了你有一些新的行之外,这是相同的代码。以及匿名类型中的冗余属性名称。
          猜你喜欢
          • 2013-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 2013-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多