将复杂的 SQL 查询转换为 EntityFramework

Converting Complicated SQL query to EntityFramework

我正在尝试将 SQL 存储过程转换为 EF Core 查询,但事实证明这超出了我的能力范围。

我正在翻译的 SP 看起来像这样:

select sale.[CustName] as [Customer Name],
    cust.City,
    Max(sale.Price) as [MaxPrice],
    Avg(sale.Price) as [Average],
    sum(case when sale.Price > 0 then 1 else 0 end) as [NumDays]
from SalesRecords as sale
    inner join Customers as cust on sale.Acct = cust.AcctNbr
where sale.[Date] between /*Start Date Param*/ and /*End Date Param*/
group by cust.[CustName], cust.City

经过大量谷歌搜索后,到目前为止,我提出了以下 EF 查询:

SalesDataModel salesData =
     (from s in Sales
      where s.Date >= start && s.Date <= end
      join c in Customers on s.Acct equals c.AcctNbr
      group s by new { s.Name, c.City } into cg
      select new SalesDataModel { 
         CustName = cg.GetType().Name,
         City = cg.GetType().City
         MaxBorrowed = (from sa in Sales
                        select sa.Price).Max(),
         Average = (from sa in Sales
                    select sa.Price).Average(),
         NumDays = (from sa in Sales
                    where sa.Price > 0
                    select sa.Price).Count()
         }).ToListAsync();

...所以我认为我走在正确的轨道上。到目前为止,我有两个问题:

  1. 将我的两个数据集分组到 cg 后,我如何 select 来自该组的值来填充 SalesDataModel? cg.GetType() 似乎不是这样,因为在那里找不到我的“客户”模型中的“城市”项目。

  2. 我做的子查询正确吗?它们应该按帐号 selecting,而不是来自整个数据集。如果我不正确,我哪里错了?

很简单GroupBy查询:

var query =
    from s in Sales
    where s.Date >= start && s.Date <= end
    join c in Customers on s.Acct equals c.AcctNbr
    group s by new { s.Name, c.City } into g
    select new SalesDataModel 
    { 
        CustName = g.Key.Name,
        City = g.Key.City,
        MaxBorrowed = g.Max(x => x.Price),
        Average = g.Average(x => x.Price),
        NumDays = g.Sum(x = > .Price > 0 ? 1 : 0)
    };