gpt4 book ai didi

c# - 如何过滤嵌套关系

转载 作者:行者123 更新时间:2023-11-30 17:37:59 24 4
gpt4 key购买 nike

我有三个表:

public class A 
{
[Key]
public int Id {get; set;}

public virtual ICollection<B> Bs {get; set;}
}

public class B
{
[Key]
public int Id {get; set;}
public int AId {get; set;}

[ForeignKey("AId")]
public virtual A A {get;set;}
public virtual ICollection<C> Cs {get;set;}
}

public class C
{
[Key]
public int Id {get; set;}
public int BId {get; set;}

[ForeignKey("BId")]
public virtual B B {get;set;}
}

我想要做的是获取一个过滤的 A 记录列表,该列表只会加载 Bs,而 Bs 又将被过滤以仅返回 Cs 列表,该列表也将被过滤(Cs 列表将仅包括一条记录)。我知道这听起来有点令人困惑,但看看我尝试过的代码可能会有点道理。

这是我目前拥有的:

    int cId = 123;
var filtered = aRepo.GetAll() // returns dbContext.Set<A>()
.Where(a => a.Bs
.Where(b => b.Cs
.Where(c => c.Id == cId).FirstOrDefault() != null
).FirstOrDefault() != null
).ToList();

这种方法的问题在于,一旦我找到 C 的匹配项,B 就会加载映射到 B 的所有 C 的列表,B 和 A 也会发生同样的情况。我可以理解为什么会这样发生了,但我似乎无法弄清楚如何以一种方式做到这一点,以便只加载一个 C,并且只加载映射到该 C 的 B。

非常感谢任何帮助,谢谢。

最佳答案

尝试使用 JOIN 获取所有三元组:

    var filtered = from a in aRepo.GetAll()
join b in bRepo.GetAll() on a.Id equals b.AId
join c in cRepo.GetAll() on b.Id equals c.BId
where c.Id == cId
select new { aid= a.Id, bid= b.Id, cid = c.Id};

关于c# - 如何过滤嵌套关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37181704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com