将复杂的 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();
...所以我认为我走在正确的轨道上。到目前为止,我有两个问题:
将我的两个数据集分组到 cg 后,我如何 select 来自该组的值来填充 SalesDataModel? cg.GetType() 似乎不是这样,因为在那里找不到我的“客户”模型中的“城市”项目。
我做的子查询正确吗?它们应该按帐号 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)
};
我正在尝试将 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();
...所以我认为我走在正确的轨道上。到目前为止,我有两个问题:
将我的两个数据集分组到 cg 后,我如何 select 来自该组的值来填充 SalesDataModel? cg.GetType() 似乎不是这样,因为在那里找不到我的“客户”模型中的“城市”项目。
我做的子查询正确吗?它们应该按帐号 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)
};