【问题标题】:Linq Left Join selecting a collection as a propertyLinq Left Join 选择一个集合作为属性
【发布时间】:2020-09-17 05:56:07
【问题描述】:

我是 Linq 的新手,我正在尝试加入两个表的 - 准确地说是左连接,我期望结果的属性是一个集合的前 10 个结果。

考虑样本模型

Class A { int Id, List<B> Collection }
Class B { int Id, int x, int y }

我正在尝试执行左连接,以便我期望的响应需要采用以下格式:

int A
Collection (part of B) =>{int x}

我尝试了以下查询

From A in _context.A 
Join B in (from B in _context.B select new {Id, x }) on B.Id equals A.Id Into subB
From minimalB in subB.defaultIfEmpty()
Select {A.Id, minimalB.x}

如何实现结果,使 x 属性作为集合映射到结果。

我为之前对问题的荒谬解释道歉!

【问题讨论】:

    标签: c# .net entity-framework linq left-join


    【解决方案1】:

    我认为您不需要 from minimalB in subB.defaultIfEmpty 部分,因为它会根据您的数据集创建类似于笛卡尔积的东西,这些数据表示为范围变量(aminimalB )。所以要收集X-s,你可以试试以下方法:

    var query = from a in context.A
                join b in context.B on a.Id equals b.Id into groupedB
                where groupedB.Any()
                select new { a.Id, Xs = groupedB.Select(b => b.X) };
    

    顺便说一句,如果您的 A 类中已经有 B 集合,您可以在没有显式连接的情况下进行查询(在后台,查询提供程序仍然会进行连接)

    var query = _context.A.Select(a => new 
                        { 
                            a.Id,
                            Bs = a.Collection.Select(b => new { b.X, b.Y }) 
                        });
    

    【讨论】:

    • 我赌 50 美元,在这种情况下几乎没有人知道笛卡尔积是什么。更不用说为什么这是一件坏事了。
    • 包含是强制性的吗?我的意思是即使没有包含权它也能工作?
    • @CaptainKenpachi 能不能简单解释一下?
    • 不,这并不总是强制性的,我认为您可以配置延迟加载,以便在需要时加载集合
    • 给定两个集合AB,它们的笛卡尔积是所有对(a, b)的集合,其中aA的一个元素,b是一个B 的元素。非正式地,您的集合使用两个范围变量aminimalB 表示,因此结果将是来自AB 的值之间的所有对的集合(或c# 语言中的序列)@ 就像@ 987654340@
    猜你喜欢
    • 2015-07-14
    • 2015-09-21
    • 2020-08-02
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多