【问题标题】:How to write this SQL in Linq Lambda using extensions如何使用扩展在 Linq Lambda 中编写此 SQL
【发布时间】:2026-02-01 09:50:01
【问题描述】:

我一直在尝试将我拥有的这个 SQL 转换为 lambda 表达式。但是我现在花了太多时间试图解决它,希望你们能向我解释一个解决方案。

SELECT *
FROM Products
INNER JOIN Details on Products.ID = Details.ID
INNER JOIN Orders ON Details.ID = Orders.ID

尝试:

db.Products.Include(x => x.Details)
           .Include("Details.Orders");

尝试使用Join 方法也无济于事。它需要以Iqueryable 的形式返回。我认为使用 include 会简化加入过程,但它似乎更复杂。无论我在Include 中包含哪些表,似乎都无法获得Orders

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    如果你使用的是 EF,你可以这样做:

    db.Products.Include(x => x.Details)
               .Include(x => x.Details.Orders);
    

    否则,使用 LINQ to SQL,您可以将 SQL 翻译为:

    from p in db.Products
    join d in db.Details on p.ID equals d.ID
    join o in db.Orders on d.ID equals o.ID
    select new { p, d, o};
    

    转换为 lambda 语法为:

    db.Products.Join(db.Details, p => p.ID, d => d.ID, (p,d) => new { p, d })
               .Join(db.Orders, d => d.ID, o => o.ID, (pd, o) => new { pd.p, pd.d, o });
    

    【讨论】:

    • 我本来就是希望这样做的。但是细节不包含订单的定义,即使它们已链接到数据库中
    • @Jeremy 你需要修复你的模型。
    • 我认为它会起作用,因为模型是从数据库生成的
    • EF 在列名中需要一些帮助来实现外键关系。我觉得你有 Products.ID == Details.ID == Orders.ID 很奇怪(例如 1:1:1 关系)。
    • 您能否链接任何资源让我查看有关协助 EF 处理关系的资源
    最近更新 更多