У меня есть классИспользование навигации для загрузки сущности 2 уровень глубокой
public class Level1
{
public int Id {get; set;}
public virtual List<Level2> Level2List {get; set;}
}
public class Level2
{
public int Id {get; set;}
public int Level3Id {get; set;}
public virtual Level3 Level3 {get; set;}
}
public class Level3
{
public int Id {get; set;}
public string Name {get; set;}
}
С помощью навигационных свойств я мог загрузить List<Level2>
как этот
var myList = _myLevel1Repository.GetSingle(x=>x.Id == Level1Id, x=>x.Level2List);
но как загрузить LEVEL3 и его свойства, которые связаны с уровнем 2?
PS: Lazy loading невозможно. Это Getsingle
функция
public T GetSingle(Func<T, bool> where, params Expression<Func<T, object>>[] navProps)
{
T item = null;
using (var context = new MyDbContext())
item = GetFilteredSet(context, navProps).AsNoTracking().FirstOrDefault(where);
return item;
}
Ровно, первый 'Include' метод, который я упомянул это не самый лучший вариант. Вы можете ошибиться при вводе имени одного свойства, или вы также можете забыть переименовать один из них в пути, если вы измените какое-либо имя свойства на вашей модели. – octavioccl
ОК, как и сказал, я изменил метод getingle. и ваша последняя строка кода работала как шарм. но не могли бы вы объяснить мне одну вещь? В этом коде 'var entity = _myLevel1Repository.GetSingle (x => x.Id == Level1Id, x => x.Level2List.Select (l2 => l2.Level3));' зачем использовать l2, как в '.select (l2 => l2.Level3) ', а не x. И я мог бы пойти еще глубже? – Cybercop
Поскольку мне нужно выбрать свойство из объекта 'Level2' (который будет вашим вторым уровнем),' x' является вашим корнем.О уровнях загрузки более глубже, да, вы можете, в ссылке, которую я разделяю, связанной со вторым 'Include', вы найдете пример:' query.Include (e => e.Level1Collection.Select (l1 => l1.Level2Collection.Select (l2 => l2.Level3Reference))). ' – octavioccl