LINQ 方法语法包含 4 层深
LINQ Method Syntax to INCLUDE 4 Levels Deep
我一直在寻找没有成功(或者不知道如何正确搜索这个)所以我来找你。
查看这些测试 类:
public class A {
int Id;
ICollection<B> Bs;
}
public class B {
int Id;
int AId;
ICollection<C> Cs;
}
public class C {
int Id;
int BId;
ICollection<D> D;
}
public class D {
int Id;
int CId;
bool Show;
}
我想做的是使用 eager loading 在一次调用中获取所有这些 类(确保数据库只被调用一次)。
下面是实际的 TSQL
我想转换为 LINQ Method
语法(我认为是正确的行话)而不是 LINQ Query
语法。
SELECT *
FROM A
LEFT JOIN B ON B.AId = A.Id
LEFT JOIN C ON C.BId = B.Id
LEFT JOIN D ON D.CId = C.Id
WHERE A.Id = 1
这是我到目前为止得到的结果
var x = db.A
.Include(a => a.B)
.Include(a => a.Bs.Select(b => b.C)
// How do I get D?
.FirstOrDefault(a => a.Id == 1);
虽然我认为这不重要,但我想指出,以防万一,最后,我需要为 A
做一些事情,稍后,我需要获取所有具有 Show == true
.
的 D
您的示例模型有点不一致,您为模型 类 和 LINQ 查询使用了不同的名称,例如B
对比 Bs
。除此之外,我相信您可以通过在内部查询中嵌套另一个 Select()
来实现您想要的。
例如
var x = db.A
.Include(a => a.Bs.Select(b => b.Cs.Select(c => c.Ds))
.FirstOrDefault(a => a.Id == 1);
我一直在寻找没有成功(或者不知道如何正确搜索这个)所以我来找你。
查看这些测试 类:
public class A {
int Id;
ICollection<B> Bs;
}
public class B {
int Id;
int AId;
ICollection<C> Cs;
}
public class C {
int Id;
int BId;
ICollection<D> D;
}
public class D {
int Id;
int CId;
bool Show;
}
我想做的是使用 eager loading 在一次调用中获取所有这些 类(确保数据库只被调用一次)。
下面是实际的 TSQL
我想转换为 LINQ Method
语法(我认为是正确的行话)而不是 LINQ Query
语法。
SELECT *
FROM A
LEFT JOIN B ON B.AId = A.Id
LEFT JOIN C ON C.BId = B.Id
LEFT JOIN D ON D.CId = C.Id
WHERE A.Id = 1
这是我到目前为止得到的结果
var x = db.A
.Include(a => a.B)
.Include(a => a.Bs.Select(b => b.C)
// How do I get D?
.FirstOrDefault(a => a.Id == 1);
虽然我认为这不重要,但我想指出,以防万一,最后,我需要为 A
做一些事情,稍后,我需要获取所有具有 Show == true
.
D
您的示例模型有点不一致,您为模型 类 和 LINQ 查询使用了不同的名称,例如B
对比 Bs
。除此之外,我相信您可以通过在内部查询中嵌套另一个 Select()
来实现您想要的。
例如
var x = db.A
.Include(a => a.Bs.Select(b => b.Cs.Select(c => c.Ds))
.FirstOrDefault(a => a.Id == 1);