Jak uwzględnić wszystkie poziomy obiektu w EF? [duplikować]
Nov 23 2020
Mam obiekt, który definiuje strukturę sieci, chcę przesłać wszystkie dzieci tego obiektu i dzieci dzieci i tak dalej.
W tej chwili mam to:
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;
Ten kod osiągnie większość poziomów, ale jeśli sieć ma wiele różnych warstw, nie otrzyma wszystkich. Jak mogę to zrobić, aby wszystkie warstwy zostały uwzględnione.
Odpowiedzi
1 Dominik Nov 23 2020 at 20:21
Myślę, że nie ma wbudowanego sposobu, aby załadować „wszystkie” warstwy, ponieważ teoretycznie byłoby możliwe, że masz cykliczne odniesienia.
Ten fragment utworzy zapytanie o liczbę warstw
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());
}
}
}
Stosowanie:
var children = await DbContext.Roots
.Include(3, a => a.Children)
.SingleOrDefaultAsync(a => a.Id == 5);
rodrigo.cantunes Nov 23 2020 at 20:40
Myślę, że najłatwiejszym sposobem na osiągnięcie tego jest leniwe ładowanie, spójrz na ten post