c# - 在 Entity Framework 中选择作为子查询接收的列的不同计数和总和

标签 c# sql entity-framework

我想获取一份报告的汇总数据,该报告显示 Entity Framework 语法中每个决策的总量和供应商计数。我的结果需要包含每个决策的供应商总数和总供应商数量的总和。

我有一个包含以下列的供应商表:

供应商编号 |决定 |决定发布日期 |金额 |供应商集团 |子供应商

获取特定时间段以上数据的原始 SQL 查询是:

SELECT S.Decision, SUM(S.Amount) AS TotalAmount, COUNT(DISTINCT S.SupplierNo) AS SupplierCount
FROM (SELECT * FROM Indentors WHERE Indentors.DecisionIssuedOn BETWEEN '2018-01-01' AND '2018-12-31') S
GROUP BY S.Decision

给出的数据为:

     SupplierCount | Amount 
     -----------------------
Approved     20 |  5000

Rejected     11 |  3000

In-Process   5  |  1500

现在,从前端,条件参数可以是给定选项池(下拉列表)中的任何内容

WHERE Decision = 'Approved' AND SupplierGroup ='ABC' AND SubSupplier ='zxc'

问题是我很难使用 Entity Framework lambda 表达式而不是原始 SQL 获得所需的结果。

到目前为止我做了什么:

我检查了来自 fornt-end 的 Options 的可用性以构建 where 子句:

IQueryable<Supplier> suppliers = this.db.suppliers.OrderByDescending(i => i.Id);


            if (string.IsNullOrEmpty(selectedSupplierGroup) == false)
            {
                suppliers = suppliers.Where(i => i.SupplierGroup == selectedSupplierGroup);
            }

            if (string.IsNullOrEmpty(selectedSubSupplier) == false)
            {
                suppliers = suppliers.Where(i => i.SubSupplier == selectedSubSupplier);
            }
            if (string.IsNullOrEmpty(selectedDecision) == false)

            {
                suppliers = suppliers.Where(i => i.Decision == selectedDecision);
            }

            if (selectedDecisionIssuedOn.HasValue)

            {
                suppliers = suppliers.Where(i => i.DecisionIssuedOn >= selectedDecisionIssuedOn);
            }

              var result = suppliers
                        .GroupBy(i => i.Decision)
                        .Select(i => i.SupplierNo).Distinct().Count(); // Gives me error

错误是:

IGrouping does not contain a definition for SupplierNo, and no extension method blah blah blah...

但在那之后我无法获取数据,因为原始查询(如上所述)会获取我。谢谢

最佳答案

这应该会为您提供与 SQL 查询类似的结果。试一试,看看进展如何:

var results = suppliers
    .Where(i => i.DecisionIssuedOn >= selectedDecisionIssuedOn)
    .GroupBy(i => i.Decision)
    .Select(group => new
    {
        Decision = group.Key,
        TotalAmount = group.Sum(g => g.Amount),
        SupplierCount = group.Select(i => i.SupplierNo).Distinct().Count()
    });

关于c# - 在 Entity Framework 中选择作为子查询接收的列的不同计数和总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56079176/

相关文章:

c# - 在 C# 中舍入 double 值

c# - 动态数据显示等值线白边

sql - 为用户 View 美化数据库中的值的正确位置在哪里?

c# - Entity Framework 在三个表中提取空值

entity-framework - 有人使用代码优先方法与 Edmx 文件混合的 Entity Framework 吗?

c# - 从文本文件命名变量

c# - javascript从一个cshtml页面验证值来检查其他cshtml页面?

sql - 使用变量过滤'IN'子句中​​的字段

sql - 在哪里定义oracle包中的默认值

c# - 为什么 SaveChanges() 只保存现有行的修改,而不保存删除或添加的条目?