C# SQL/Linq/Entity Framework 计算来自大数据源的多列的列总计

标签 c# mysql sql linq entity-framework

很抱歉打扰您,但是我在将 SQL 查询转换为 C# Entity Framework 时遇到了问题。

我的SQL查询如下:

SELECT CAST(ROUND(sum(size/rate), 0) AS INT) s,
CAST(ROUND(sum(PL/rate), 0) AS INT) PL
FROM [bs].[b] b
join [bs].[s] s on b.id = s.b_id
join [bs].[o] o on s.o_id = o.id
join [bs].[a] a on o.a_id = a.id
join [fs].[f] f on b.f_id = f.id


where f.r_date 
between '2013-05-01 00:00:00.000'
and '2013-05-31 00:00:00.000'
and s.deleted_at is NULL
and b.group_id = '0'
and (o.a_id = 50 or o.a_id = 52)

我反过来设法完成所有连接并在适当的地方声明(又名“The Easy Bit”)但是我只是找不到一种方法来使列总计的这些总和起作用。

这是我目前所拥有的:

var GroupSk = (from Bs in sb.b
join S in sb.s on Bs.id equals S.b_id
join O in sb.o on S.o_id equals O.id
join A in sb.a on O.a_id equals A.id
join Fs in sb.vw_f on Bs.f_id equals Fs.f_id

where Fs.r_date >= t_FromDate && Fs.r_date <= t_ToDate
where S.deleted_at == null
where Bs.group_id == 0
where O.a_id == 50 || O.a_id == 52

select new {

如您所见,它是查询的 SUM 部分之前的所有内容。

此查询可以返回 1 到 150000 行之间的任何位置,我需要一种方法来确保及时返回我得到的列总数。

我最初计划使用 ForEach 循环,但在实现它时遇到了麻烦(事实上,如果返回更多的行,它可能需要很长时间)。

我知道那里有一些“求和列总计”问题,但它们不处理多个表和多个列输出。它们似乎也仅限于总共 2 或 3 列,而我的表格远远超出了这一点。

我们将不胜感激任何帮助。

最佳答案

这有点麻烦,但它确实有效。诀窍是创建一个包含所有项目的组,然后对该组求和:

var GroupSk = (from Bs in sb.b
    join S in sb.s on Bs.id equals S.b_id
    join O in sb.o on S.o_id equals O.id
    join A in sb.a on O.a_id equals A.id
    join Fs in sb.vw_f on Bs.f_id equals Fs.f_id

    where Fs.r_date >= t_FromDate && Fs.r_date <= t_ToDate
    where S.deleted_at == null
    where Bs.group_id == 0
    where O.a_id == 50 || O.a_id == 52

    select new { r1 = ??.size / ??.rate, r2 = ??.PL / ??.rate })
    .GroupBy(x => 0)
    .Select(g => new { 
                        R1 = g.Sum(x => x.r1), 
                        R2 = g.Sum(x => x.r2)
                     });

我把 ?? 标记放在我不知道属性来源的地方,所以你必须在那里替换正确的变量名。 (Bs、S、O、A、Fs)。

这将转化为一个 SQL 查询,因此所有处理都由数据库引擎完成,只有小的结果对象通过网络传输。

关于C# SQL/Linq/Entity Framework 计算来自大数据源的多列的列总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21386612/

相关文章:

c# - 我可以继承构造函数吗?

c# - C# winforms 上的文件夹浏览器对话框

c# - 如何取消ServiceStack异步请求?

sql - pgSQL FULL OUTER JOIN 'WHERE' 条件

c# - 将 T4 输出从导入的程序集保存到文件

php - MySQL 数据库锁定

php - 上传 CSV 或 XML 进行编辑和返回

mysql - 按评论数排序同表sql

SQL 使用 AND 在列中查找两个值

java - H2 嵌入模式 - DELETE 命令给出 COLUMN NOT FOUND 错误