c# - 如何在 EF 中包含对象的所有级别?
问题描述
我有一个定义网络结构的对象,我想发送该对象的所有孩子以及孩子的孩子等等。
现在我有这个:
var Data = await _context.Scans
.Include(c => c.networkDevices)
.ThenInclude(d => d.ports)
.ThenInclude(p => p.Service)
.Include(c => c.root)
.ThenInclude(d => d.children).ThenInclude(p => p.children).ThenInclude(c => c.children)
.ToListAsync();
return Data;
此代码将获得大多数级别,但如果网络有许多不同的层,则不会获得所有层。我怎样才能使它包含所有图层。
解决方案
我认为没有内置的方式来加载“所有”层,因为理论上你可能有循环引用。
此代码段将创建对层数的查询
namespace System.Data.Entity
{
using Linq;
using Linq.Expressions;
using Text;
public static class QueryableExtensions
{
public static IQueryable<TEntity> Include<TEntity>(this IQueryable<TEntity> source,
int levelIndex, Expression<Func<TEntity, TEntity>> expression)
{
if (levelIndex < 0)
throw new ArgumentOutOfRangeException(nameof(levelIndex));
var member = (MemberExpression)expression.Body;
var property = member.Member.Name;
var sb = new StringBuilder();
for (int i = 0; i < levelIndex; i++)
{
if (i > 0)
sb.Append(Type.Delimiter);
sb.Append(property);
}
return source.Include(sb.ToString());
}
}
}
用法:
var children = await DbContext.Roots
.Include(3, a => a.Children)
.SingleOrDefaultAsync(a => a.Id == 5);
推荐阅读
- java - 使用 maven 将日志级别注入 logback.xml
- javascript - 在不同的js页面中定义Vue方法函数
- angular - Angular Jasmin ObjectSpy 不是函数
- moodle - 当学生开始课程或完成课程时,如何获得 Moodle 的回复?
- javascript - Jquery 测试套件没有通过
- python - Python:如何更新散景中的数据选择?
- pentaho - 在转型 Pentaho 中处理 2700 万条记录
- angular - 我该如何解决这个错误以及它发生的原因?
- python - 在python中标记图像以进行分类
- php - 我怎样才能得到一个字符串后面的单词?