C# Linq EF Core 6.0仅当include不为空时才检索作为include的一部分的对象的辅助列表

jjhzyzn0  于 2022-12-20  发布在  C#
关注(0)|答案(1)|浏览(248)

我试图使用Linq来获取一个对象列表。每个对象的一部分都是一个潜在的相同类型的子对象列表,如果没有列表,那么它就是空的。我试图弄清楚如何让这个二级列表与我的每个主对象一起返回。
这是我的主要类别。在一个特定位置可能有一个以上的显示器,而我希望能够看到并链接回共用该位置的其他显示器。如果它是唯一的显示器,则我将Group设为null,因此不会为单一显示器建立群组。

public class Display
{
    public int DisplayId { get; set; }
    public string DisplayName { get; set; } = null!;
    public int? DisplayGroupId { get; set; }
    //Displays At Same Location
    public DisplayGroup? DisplayGroup { get; set; }
}

这是我的中间表格,用来显示哪些显示器位于同一位置。

public class DisplayGroup
{
    public int DisplayGroupId { get; set; }
    public List<Display> Displays { get; set; } = null!;

}

下面是一个我认为是最好的例子,它说明了我试图获取列表的过程。不幸的是,当我运行这个过程时,我得到了一个异常'System.InvalidOperationException' in System.Private.CoreLib.dll

List<Display> list = await _context.Displays.AsNoTracking()
                .Include(x => x.DisplayGroup)
                .ThenInclude(x => x.Displays)
                .ToListAsync();
return list;

在阅读了各种地方,包括StackOverflow,我还没有能够得到一个答案,实际上返回我正在寻找的。
对不起,如果我没有提供所有需要帮助解决我的问题,这是我第一次问。如果需要更多的信息,我可以回邮。
预先感谢你的帮助。
我希望得到的结果是这样的:
| 显示器|在同一位置显示|
| - ------| - ------|
| 显示器A|显示B/显示C/显示E|
| 显示器B|显示A/显示C/显示E|
| 显示器C|显示A/显示B/显示E|
| 显示器D|不适用|
| 显示E|显示A/显示B/显示C|
| 显示F|显示G|
| 显示G|显示F|
在这里我可以点击上面任何一个显示名称,转到与它们相关的页面。

8ftvxx2r

8ftvxx2r1#

我不太清楚你所说的“点击”等是什么意思,但这个答案应该能解决我认为你试图阐明的问题。
假设您有一个Display对象的平面列表,对于任何特定对象,您希望获取同一组中所有其他Display对象的列表。

List<Display> getDisplayGroupForDisplay(int displayId) {
    List<Display>? displays = await _context.Displays.First(x => x.displayId == displayId).DisplayGroup?.Displays;
    return displays != null ? displays : new List<Display>();
}

相关问题