【问题标题】:how do you chain left joins with a lambda你如何用 lambda 链接左连接
【发布时间】:2020-06-11 22:36:32
【问题描述】:

假设我有

    class A
        {
            int id;
            IQueryable<B> bs;
        }
        class B
        {
            int id;
            int AId;
            IQueryable<C> cs;
        }
        class C
        {
            int id;
    int AID
            int Bid;

        }
and in sql i could join them like
    select * from A
    left join b on a.Id = B.AID
    left join c on a.ID = c.AId and b.id = c.bID

我怎么能用 lambda 做到这一点?我知道一般左加入是通过组加入完成的,但我不知道如何获取 c 所需的密钥

【问题讨论】:

  • 这能回答你的问题吗?看答案,用 lambda LEFT OUTER JOIN in LINQ
  • 并非如此。我可以让第一个加入工作得很好,这就是他们在示例中所做的。我的问题在于加入第三种类型
  • 这可能是一个很好的学术问题,但在现实世界中你是在浪费你的时间,因为当你使用对象集合时,直接 LINQ 比 lambda 连接快得多。如果你最终使用 Linq-to-sql,你最后也可能有错误的查询。由于性能(linq to objects)和查询正确性(LTS),我已经完成了用 LINQ 替换所有 lambdas(带有连接)的练习。
  • 我没有注意到性能问题。也许您正在处理比我更大的数据集,但您说得对,这主要是一个学术问题,因为我可以使用 ado 轻松解决我自己的问题并执行 sql,这将比任何一个都快。
  • 来自我的旧工作电子邮件:var data = from a in listA from b in listB.Where(x =&gt; x.Id == a.Id) select a; // ~ 3.5 secvar data = from a in listA join b in listB on a.Id equals b.Id select a; // ~ 0.03 sec

标签: c# .net linq lambda entity-framework-core


【解决方案1】:

目前无法使用我使用的实体框架版本(ef core 3.0)完成此操作,因为它不支持组加入。希望这会改变

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多