【问题标题】:Linq Sum SyntaxLinq 总和语法
【发布时间】:2017-12-15 19:50:13
【问题描述】:

我觉得我疯了。任何人都可以帮助解决这种语法有什么问题吗?

我希望对一列进行简单的求和。 SQL 将是;

Select sum(x1.On_Hand_Qty)
From Material_Location x1
Where x1.Material = '3171784-18'

在 LINQ 中我尝试过;

var results = (from x1 in Material_Locations
               where x1.Material == "3171784-18"
               select new {x1.On_Hand_Qty}).Sum();

但出现此错误;

'System.Linq.IQueryable<AnonymousType#1>' 不包含 'Sum' 的定义和最佳扩展方法重载 'System.Linq.Queryable.Sum(System.Linq.IQueryable<int>)' 有一些 无效参数

实例参数:无法从 'System.Linq.IQueryable<AnonymousType#1>''System.Linq.IQueryable<int>'

我试过了;

var results = from x1 in Material_Locations
              where x1.Material == "3171784-18"
              select new {x1.On_Hand_Qty.Sum()};

得到了这个错误;

匿名类型成员声明器无效。匿名类型成员必须 使用成员分配、简单名称或成员访问来声明。

Material_Location.On_Hand_Qty 在 SQL Server 中是双精度数。

我的语法用完了。一定有我失踪的演员或类似的东西。如果你来长岛,我会用啤酒行贿。有什么想法吗?

【问题讨论】:

    标签: c# linq linqpad


    【解决方案1】:

    不要投影匿名对象。只是:

    var results = (from x1 in Material_Locations
                   where x1.Material == "3171784-18"
                   select x1.On_Hand_Qty).Sum();
    

    当您投影匿名对象 (new {..}) 然后执行 Sum 时,编译器无法对项目求和 - 因为项目不是数值而是对象。而且这些对象不会覆盖+ 运算符,也不能隐式转换为数值。

    您尝试x1.On_Hand_Qty.Sum() 的第二个版本将无法正常工作,正如您所说,On_Hand_Qtydouble,而不是具有Sum 扩展方法的IEnumerable<T>

    【讨论】:

      【解决方案2】:

      或者你可以使用:

      var results = Material_Locations
         .Where(q => q.Material == "3171784-18")
         .Sum(q => q.On_Hand_Qty)
      

      【讨论】:

      • 这是此类命令的首选语法,因为它更具可读性。我认为你应该补充你的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 2012-04-18
      • 1970-01-01
      相关资源
      最近更新 更多