【问题标题】:LINQ uses extra inner joinLINQ 使用额外的内部连接
【发布时间】: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 语句。那么你不需要加入也不需要分组。

标签: c# sqlite linq


【解决方案1】:

使用u.Res 导航属性时生成的附加连接。实际上,这里不需要显式连接。

from u in _db.Upgrades
where  u.Lvl > levelFrom
    && u.Lvl <= levelTo
group u by new { u.Res.id, u.Res.Name } into grp
select new UpgradeCost()
{
    resName = grp.Key.Name,
    resAmount = grp.Sum(k => k.Amount),
};

【讨论】:

  • 哦,我明白了!谢谢!
猜你喜欢
  • 2015-03-06
  • 2010-09-28
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多