Pas*_*cal 5 c# entity-framework-core
对于TestType,我想同时包含导航道具Schoolclass和Subject。
我可以这样做:
.Include(t => t.TestType)
.ThenInclude(x => x.Subject)
Run Code Online (Sandbox Code Playgroud)
但不是:
.Include(t => t.TestType)
.ThenInclude(x => x.Subject)
.ThenInclude(x => x.Schoolclass)
Run Code Online (Sandbox Code Playgroud)
因此,我尝试了一些技巧,并且奏效了:
我将TestType包含了2次...
var test = await context.Tests.Where(t => t.SchoolyearId == schoolyearId)
.Include(t => t.TestType)
.ThenInclude(x => x.Subject)
.Include(t => t.TestType)
.ThenInclude(x => x.Schoolclass)
.AsNoTracking()
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
这是官方的方法还是有更好的方法?
更新
public class TestType
{
public TestType()
{
Tests = new HashSet<Test>();
}
public int Id { get; set; }
public string Name { get; set; }
public int Weight { get; set; }
public ISet<Test> Tests { get; set; }
public Schoolyear Schoolyear { get; set; }
public Schoolclass Schoolclass { get; set; }
public Subject Subject { get; set; }
public int SchoolyearId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
小智 5
最好的方法是您之前写过,带有两个.Include(t => t.TestType)
var test = await context.Tests.Where(t => t.SchoolyearId == schoolyearId)
.Include(t => t.TestType)
.ThenInclude(x => x.Subject)
.Include(t => t.TestType)
.ThenInclude(x => x.Schoolclass)
.AsNoTracking()
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
如果您在SQL事件探查器中看到查询结果,则查询是您假装的,而没有重复对TestType的包含(该表只有1个联接)
您还有另一种方法可以做到,但是我更喜欢以前的方法!
.Include("TestType.Subject")
.Include("TestType.Schoolclass")
Run Code Online (Sandbox Code Playgroud)
这种方法是 1.1.0 中唯一存在的方法:)
更好的一个有点不同 - 不要在一个查询中加载所有对象(数据库将连接 4 个表 - Tests, TestType, Schoolyear, Schoolclass),因为这可能会导致不必要的数据增长(当你在 中有很多记录时tests)。
如果您的某些表(Schoolyear?甚至 TestType?)包含相对少量的记录(与“主”Tests表相比) - 您可以TestTypes.Include(x => x.Subject).Include(x => x.Schoolclass)先加载,将它们保存在某个列表中,然后仅查询而Tests无需额外的“包含”。但是,一旦您TestType在内存中拥有了所有必需的依赖项,就可以从内存中访问它们。
此外,如果您的某些表很少更改 - 使用缓存从数据库中读取它们一次,并在必要时重新读取(删除管理此表的控制器中的适当缓存条目)。
| 归档时间: |
|
| 查看次数: |
2693 次 |
| 最近记录: |