【发布时间】:2020-10-02 08:50:40
【问题描述】:
我正在尝试将 sql 存储过程转换为 linq。我遇到了 groupby 和 inner join 的问题。
这是我尝试过的:
var r = _context.Table1
.GroupBy(x => new { x.OptionId, x.Years, x.Strike })
.Join(_context.Table2,
oc => oc.OptionId, o => o.OptionId, (oc, o) => new
{
OptionsCosts = oc,
Options = o
}).Where(x => x.Options.OptionType == 1
&& x.Options.QualifierId != null
&& x.Options.CreditingMethod != "xxx")
.Select(y => new DataModel.Table1()
{
Years = y.Select(a => a.OptionsCosts.Years).FirstOrDefault(),
Strike = y.Select(a => a.OptionsCosts.Strike).FirstOrDefault(),
Value = y.Select(a => a.OptionsCosts.Value).FirstOrDefault(),
ChangeUser = y.Select(a => a.OptionsCosts.ChangeUser).FirstOrDefault(),
ChangeDate = DateTime.Now,
OptionId = y.Select(a => a.OptionsCosts.OptionId).FirstOrDefault()
});
这是我要转换的 SQL:
SELECT o2.OptionId, o2.Years, o2.Strike, SUM(d2.Weights) as 'TotalWeight', COUNT(*) as 'Counts'
FROM Table1 o2
INNER JOIN @Dates d2 --this is a temp table that just holds dates. I was thinking just a where statement could do it???
ON d2.EffectiveDate = o2.EffectiveDate
INNER JOIN Table2 od2
ON od2.OptionId = o2.OptionId
AND od2.OptionType = 1
AND od2.qualifierid is null
AND od2.CreditingMethod <> 'xxx' --28095
GROUP BY o2.OptionId,o2.Years, o2.Strike
我的数据有问题,所以我确定我做错了什么。
【问题讨论】:
-
linq-to-sql 或 entity-framework-core,是哪个?
-
内存中是否还有@Dates 表?
-
不管是什么,LINQ 都不能替代 SQL。从实体之间的关系生成 JOIN 是 ORM 的工作。 ORM 旨在将对象映射到关系表和视图,而不是执行任意 SQL 查询。表变量超出了任何 ORM 的范围。
-
与其尝试使用 LINQ 重写 SQL 查询,不如创建一个视图或函数并将您的对象映射到它。您可以使用
FromSqlRaw或FromSqlInterpolated将SQL 查询用作LINQ 查询的起点。表变量是个问题——它从何而来,如何创建? -
好吧,看看您的查询:
&& x.Options.QualifierId != null和 SQL:AND od2.qualifierid is null。你看出区别了吗?
标签: c# linq lambda linq-to-sql entity-framework-core