【发布时间】:2021-09-23 18:59:53
【问题描述】:
这是我的简化模型:
public class Resource
{
public int id { get; set; }
public string Name { get; set; }
}
public class Upgrade
{
public int Id { get; set; }
public virtual Resource Res { get; set; }
public int Lvl { get; set; }
public int Amount { get; set; }
}
基本上,我需要按资源分组并从“资源”中获取 [Name],从“升级”中获取 sum([Amount])。 这是 LINQ:
from u in _db.Upgrades
join r in _db.Resources on u.Res equals r
where u.Lvl > levelFrom
&& u.Lvl <= levelTo
group u by new { r.id, r.Name } into grp
select new UpgradeCost()
{
resName = grp.Key.Name,
resAmount = grp.Sum(k => k.Amount),
};
这是我得到的 SQL (Sqlite):
SELECT "r0"."Name" AS "resName", COALESCE(SUM("u"."Amount"), 0) AS "resAmount"
FROM "Upgrades" AS "u"
LEFT JOIN "Resources" AS "r" ON "u"."Resid" = "r"."id"
INNER JOIN "Resources" AS "r0" ON "r"."id" = "r0"."id"
WHERE ("u"."Lvl" > @__levelFrom_0) AND ("u"."Lvl" <= @__levelTo_1)
GROUP BY "r0"."id", "r0"."Name"
LINQ 使用额外的 INNER JOIN 进行分组。 我希望它是这样的:
SELECT "r"."Name" AS "resName", COALESCE(SUM("u"."Amount"), 0) AS "resAmount"
FROM "Upgrades" AS "u"
LEFT JOIN "Resources" AS "r" ON "u"."Resid" = "r"."id"
WHERE ("u"."Lvl" > @__levelFrom_0) AND ("u"."Lvl" <= @__levelTo_1)
GROUP BY "r"."id", "r"."Name"
【问题讨论】:
-
你的第二个 SQL 代码和 linq 代码一样。现在问题出在哪里?
-
您应该首先通过定义和使用导航属性
Resource.Upgrades来修复您的类模型和LINQ 语句。那么你不需要加入也不需要分组。