LINQ集团& SUM为LONG变量

时间:2015-04-29 09:41:11

标签: c# linq entity-framework

long  BOQ_Val = (from Boq_table in ctx.tbl_BOQ
                 where (boq_locationID == Boq_table.Location_ID
                        && boq_Code_ID == Boq_table.WorkCode_ID)
                 group Boq_table by Boq_table.WorkCode_ID into g
                 select new 
                        { 
                           units_Total = (long)g.Sum(x => x.Units) 
                        });

您好 我收到错误

  
    

"无法将system.linq.iqueryable类型隐式转换为long"

  

请帮帮我 我需要将单位总数(上述条件)变为长变量

4 个答案:

答案 0 :(得分:0)

将您的查询重写为:

long  BOQ_Val = (from Boq_table in ctx.tbl_BOQ
                   where (boq_locationID == Boq_table.Location_ID
                           && boq_Code_ID == Boq_table.WorkCode_ID)
                   group Boq_table by Boq_table.WorkCode_ID into g
                   select g.Sum<long>(x => x.Units)).FirstOrDefault();

当您只想获得总和时,无需在Select stement中创建匿名类对象。

关于这个结构:

units_Total = (long)g.Sum(x => x.Units)

假设Units的类型为int,则将Sum转换为long是没有意义的,因为此方法将生成将在int值范围内的sum。 这应该是你应该使用的方式:

g.Sum<long>(...)

答案 1 :(得分:0)

我建议您使用cast<long>并选择您的第一项

 long  BOQ_Val = (from Boq_table in ctx.tbl_BOQ
                       where (boq_locationID == Boq_table.Location_ID
                               && boq_Code_ID == Boq_table.WorkCode_ID)
                       group Boq_table by Boq_table.WorkCode_ID into g
                       select new { units_Total = g.Sum<long>(x => x.Units) }).FirstOrDefault();

答案 2 :(得分:0)

您可以使用FirstOrDefaultSingleOrDefault,因为您只需要一个值。

 long  BOQ_Val = (from Boq_table in ctx.tbl_BOQ
                       where (boq_locationID == Boq_table.Location_ID
                               && boq_Code_ID == Boq_table.WorkCode_ID)
                       group Boq_table by Boq_table.WorkCode_ID into g
                       select new { units_Total = g.Sum(x => x.Units) }).FirstOrDefault();

答案 3 :(得分:0)

如果您希望IQueryable<long>成为BOQ_Val,则查询结果为long

您首先按WorkCodeId进行过滤,这会为您提供IQueryable<BOQ_Table>,然后按BOQWorkCodeId进行分组。这会留下IQueryable<IGrouping<int, long>>,其中密钥为WorkCode_Id。从每个分组中选择long,为您留下IQueryable<long>。你和我都知道最多只有一个结果,因为你对之前过滤过的变量进行了分组,但是C#不知道,所以你必须选择一个结果。

重写最好的方法取决于你。如果您已使用boq_Code_IDwhere进行过滤,则不再需要对其进行分组,因此只需一种方式

long  BOQ_Val = (from Boq_table in ctx.tbl_BOQ
                 where (boq_locationID == Boq_table.Location_ID
                     && boq_Code_ID == Boq_table.WorkCode_ID)
                 ).Sum(Boq_table => (long)Boq_table.Units);

个人我更喜欢完整的扩展方法(我认为它更清晰。但我似乎是少数)。走这条路会给你

long  BOQ_Val = ctx.tbl_BOQ.Where(Boq_table => 
                     (boq_locationID == Boq_table.Location_ID &&
                      boq_Code_ID == Boq_table.WorkCode_ID)
                 ).Sum(Boq_table => (long)Boq_table.Units);

如果Boq_table.Units已经很长,则类型转换在此处不起作用。如果它是一个int,可能需要防止溢出。如果这是演员阵容的目标,那么它需要位于Sum的内部,否则您只需将int上的溢出物转换为long,这绝对不会