класс Таак:
[Key]
public int TaakId { get; set; }
public int Pid { get; private set; }
[Required]
[Range(0,23.5)]
public double Uur { get; private set; }
[Required]
public Functie Functie { get; private set; }
public List<Taak> Taken { get; private set; }
[NotMapped]
public ICollection<WerknemerTaak> Werknemers { get; set; }
класс WerknemerTaak:
[Required]
public Werknemer Werknemer { get; set; }
[Required]
public Taak Taak { get; set; }
public Afdelingen Afdeling { get; set; }
public string Taakbeschrijving { get; set; }
ReadAllTakenWthWerknemers :
public List<Werknemer> ReadAllWerknemersWithTaken()
{
var taken = ctx.Werknemers
.Include(x => x.Taken)
.ThenInclude(x => x.Taak)
.ToList();
return taken;
}
Программа.cs
_mgr.GetAllWerknemersWithTaken().ForEach(x =>
{
Console.WriteLine(x.ToString());
Console.WriteLine("Waarvan de taken zijn:");
x.Taken.ToList().ForEach(t =>
{
Console.WriteLine("\t"+t.Taak.ToString());
});
});
Ошибка, которую я получаю, выглядит следующим образом:
Выражение «x.Taken» недопустимо внутри операции «Включить», поскольку он не представляет собой доступ к свойству: 't => t.MyProperty'.
Я попытался добавить Where(t => t.Werknemer.Pid.Equals(t.Taak.Pid))), но безуспешно. Я искал других с такой же проблемой, но не нашел ответа для себя. И мне нужно использовать нетерпеливую загрузку.
@ChetanRanpariya Я получаю сообщение об ошибке во время компиляции. ctx.Werknemers — это общедоступный DbSet<Werknemer> Werknemers { get; набор; }
WerknemerTaak класс не имеет свойства Taken. Вот почему вы получаете ошибку.
@ChetanRanpariya нет, это не так. это дает мне ту же ошибку.





Четан прав, вы путаете свое выражение LINQ, и ваши сущности также немного переплетены, и вы должны попытаться их исправить. Переименовано, чтобы сделать его более читабельным, вы можете увидеть проблему:
var taken = ctx.Werknemers // <- Query over Werknemers...
.Include(werknemer => werknemer.Taken) // werknemer has no Taken collection...
.ThenInclude(taak => taak.Taak)
.ToList();
Изменение термина «x» не меняет тип, а просто делает его более читабельным. Когда вы расширяете x. с помощью intellisense, он обрисовывает в общих чертах свойства типа, с которым он работает.
Это выражение направлено против сущностей Werknemer, а не Taaks. Вернемерс не включает свойство «Взято», в отличие от Таака.
Это будет работать:
var taken = ctx.Taaks
.Include(x => x.Taken)
Или из Werknemers, это должно работать:
var taken = ctx.Werknemers // <- Query over Werknemers...
.Include(x => x.Taak)
.ThenInclude(x => x.Taken) // <- ThenInclude dives into Taak
Чтобы сделать его немного более читаемым в отношении того, какую сущность использует выражение:
var taken = ctx.Werknemers // <- Query over Werknemers...
.Include(werknemer => werknemer.Taak)
.ThenInclude(taak => taak.Taken)
Этот запрос по-прежнему будет выбирать Werknemers, где подразумевается, что вам нужны Taken Taaks. Чтобы получить Taaks, вы должны использовать SelectMany.
var taken = ctx.Werknemers
// Assuming you would have a `Where` clause to filter the Taken taaks from specific Werk/Taaks...
.SelectMany(werknemer => werknemer.Taak.Taken);
Чтобы быстро загрузить свойства Taak, вы должны добавить Include и т. д. После SelectMany на основе свойств навигации Taak.
Следующая проблема, с которой вы столкнетесь, — это цикл самоссылки внутри Taak с Taken. Тааку понадобится что-то вроде ParentTaakId с нулевым значением или что-то подобное, чтобы облегчить эту связь. Для Taak, который будет в коллекции Taken, должен быть FK, указывающий на родительскую запись Taak. EF необходимо будет настроить с учетом этого отношения.
[Key]
public int TaakId { get; set; }
// ...
public int? ParentTaakId { get; set; }
public List<Taak> Taken { get; private set; }
Затем, когда вы настраиваете сопоставление с помощью modelBuilder или EntityTypeConfiguration:
modelBuilder.Entity<Taak>()
.HasMany(x => x.Taken)
.WithOptional()
.HasForeignKey(x => x.ParentTaakId);
Наконец, почему ваша коллекция Werknemers в Тааке отмечена знаком [NotMapped]? Поскольку у Werknemer есть ссылка на Taak, это сопоставление должно быть хорошо настроено внутри сущности. Значения [NotMapped] следует использовать с осторожностью и, как правило, их следует избегать, поскольку может возникнуть искушение использовать их в выражении LINQ, что приведет к ошибке во время выполнения.
Итак, я получил эту ошибку при преобразовании из некоторого кода Framework в какой-то .NET Core (EF Core). Оказывается, код компилируется по-старому:
myQueryable.Include(x => x.SubProp.Select(y => y.SubSubProp));
Так что следите за этим и вместо этого преобразуйте его (как следует из других ответов) в новый EF Core ThenInclude
myQueryable.Include(x => x.SubProp).ThenInclude(x => x.SubSubProp);
SelectMany никогда не поддерживался в Include. Должно быть Select.
Хороший звонок, я отредактирую эту опечатку. Не следует псевдокодировать в S.O. :D
Какой тип данных у ctx.Werknemers? Вы получаете ошибку времени выполнения или ошибку времени компиляции?