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"
请帮帮我 我需要将单位总数(上述条件)变为长变量
答案 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)
您可以使用FirstOrDefault
或SingleOrDefault
,因为您只需要一个值。
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>
,然后按BOQ
对WorkCodeId
进行分组。这会留下IQueryable<IGrouping<int, long>>
,其中密钥为WorkCode_Id
。从每个分组中选择long
,为您留下IQueryable<long>
。你和我都知道最多只有一个结果,因为你对之前过滤过的变量进行了分组,但是C#不知道,所以你必须选择一个结果。
重写最好的方法取决于你。如果您已使用boq_Code_ID
对where
进行过滤,则不再需要对其进行分组,因此只需一种方式
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
,这绝对不会