Вы не можете фильтровать загруженные отношения.Ошибка, которую вы получаете, связана с тем, что Include
необходимо передать правильное выражение свойства, которое не является предложением Where
.
Если вы хотите загрузить только подмножество этого конкретного отношения, выВам нужно будет явно загрузить его.Например:
IQueryable<PdModel> PdModelsQuer = _context.PdModel.Where(x => x.Id == id)
.Include(x => x.PdTables)
.Include(x => x.pdFolderTree)
// remove this .Include(x => x.PdReferences.Where(y=>y.ReferenceName.Contains(searchString)))
.Include(x => x.pdViews)
.Include(x => x.pdDomains)
.Include(x => x.PdModelSources)
.Include(x => x.pdModelExtendeds)
.Include(x => x.pdRules);
foreach (var pdModel in PdModelsQuer)
{
var pdReferences = await _context.Entry(pdModel).Collection(x => x.PdReferences).Query()
.Where(x = x.ReferenceName.Contains(searchString)).ToListAsync();
}
Если это не очевидно, это означает выдачу N + 1 запросов, где N - количество ваших PdModels.Другими словами, отфильтрованная коллекция должна выбираться для каждого экземпляра индивидуально.
Однако, основываясь на запросах по id, кажется, что у вас должен быть только один соответствующий PdModel.Таким образом, вы действительно не должны использовать Where
здесь.Вместо.Просто добавьте все ваши включения и затем используйте SingleOrDefaultAsync
:
var pdModel = await _context.PdModel
.Include(x => x.PdTables)
.Include(x => x.pdFolderTree)
.Include(x => x.pdViews)
.Include(x => x.pdDomains)
.Include(x => x.PdModelSources)
.Include(x => x.pdModelExtendeds)
.Include(x => x.pdRules)
.SingleOrDefaultAsync(x => x.Id == id);
Затем вы можете получить PdReferences только для этого одного экземпляра:
var pdReferences = await _context.Entry(pdModel).Collection(x => x.PdReferences).Query()
.Where(x = x.ReferenceName.Contains(searchString)).ToListAsync();
Важно отметить, что этохранится в другой переменной.Установка отфильтрованной коллекции непосредственно в свойстве PdReferences
может вызвать побочные эффекты, особенно если вы в конечном итоге попытаетесь сохранить эту сущность позже, а именно, удалить что-либо, отсутствующее в отфильтрованном списке, из базы данных.В такой ситуации лучше всего использовать модель представления и соответствующим образом отображать данные.