EF में किसी वस्तु के सभी स्तरों को कैसे शामिल किया जाए? [डुप्लिकेट]
Nov 23 2020
मेरे पास एक ऑब्जेक्ट है जो एक नेटवर्क संरचना को परिभाषित करता है, मैं उस ऑब्जेक्ट के सभी बच्चों और बच्चों के बच्चों और इतने पर भेजना चाहता हूं।
अभी मेरे पास यह है:
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;
इस कोड को अधिकांश स्तर मिलेंगे, लेकिन अगर किसी नेटवर्क में कई अलग-अलग परतें हैं, तो यह सभी को नहीं मिलेगा मैं इसे कैसे बना सकता हूं ताकि सभी परतें शामिल हों।
जवाब
1 Dominik Nov 23 2020 at 20:21
मुझे लगता है कि "सभी" परतों को लोड करने के लिए कोई रास्ता नहीं बनाया गया है क्योंकि सिद्धांत रूप में यह संभव होगा कि आपके पास चक्रीय संदर्भ हो।
यह स्निपेट परतों की संख्या के लिए एक क्वेरी बनाएगा
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);
rodrigo.cantunes Nov 23 2020 at 20:40
मुझे लगता है कि इसे पूरा करने का सबसे आसान तरीका आलसी लोडिंग है, इस पोस्ट पर एक नज़र डालें