Фильтрация данных по реляционным данным в запросах Linq не работает - PullRequest
0 голосов
/ 09 мая 2019
public IEnumerable<AccountCategory> GetAllAccountsCategories(Guid applicationSubscriberId)
{
    return _context.AccountCategories.Include(s => s.AccountSubCategories)
        .ThenInclude(t => t.AccountTypes)
        .ThenInclude(d =>d.ChartOfAccounts.Where(c => c.ApplicationSubscriberId == applicationSubscriberId));           
}

Это запрос, который мне нужно сгенерировать для моего проекта, но он вызывает исключение:

Выражение свойства 'd => {из ChartOfAccount c в d.ChartOfAccounts, где ([c] .ApplicationSubscriberId == __applicationSubscriberId_0) select [c]}' недопустимо. Выражение должно представлять доступ к свойству: 't => t.MyProperty'. Для получения дополнительной информации о включении связанных данных см. http://go.microsoft.com/fwlink/?LinkID=746393

Я перепробовал все возможные варианты, но он все еще не работает. кто-то говорит, что хранимая процедура будет работать, но я не делаю хранимые процедуры.

1 Ответ

0 голосов
/ 10 мая 2019

В зависимости от того, что вы пытаетесь отфильтровать, будет определен ответ:

Я предполагаю, что вы хотите, чтобы все категории учетных записей, которые имеют AccountType.ChartOfAccounts.Subscriber, соответствовали предоставленному мной идентификатору.Это вернет категорию учетной записи и будет стремиться загрузить все типы учетных записей и соответствующие им планы счетов.

var accountCategories = _context.AccountCategories
  .Include(ac => ac.AccountSubCategories)
  .ThenInclude(sc => sc.AccountTypes)
  .ThenInclude(at => at.ChartOfAccounts)
  .Where(ac => ac.AccountSubCategories
     .Any(sc => sc.AccountTypes
        .Any(at => at.ChartOfAccounts
           .Any(ac => ac.ApplicationSubscriberId == applicationSubscriberId));

Запрос по глубоко вложенным критериям представляет собой небольшую боль.

Если вы вместо этогоЕсли вы хотите отфильтровать ChartOfAccounts для каждой возвращаемой категории учетных записей, чтобы включить диаграммы только с этим идентификатором подписчика, EF не может фильтровать наборы сущностей, поэтому вам придется выбирать эту отфильтрованную коллекцию отдельно.В зависимости от того, насколько высока фильтрация (т. Е. Включать / исключать типы учетных записей и / или подкатегории), будет определять сложность запроса.По сути, для фильтрации дочерних коллекций вам нужно явно выбрать их вместе с сущностями верхнего уровня.

Если приведенный выше пример не отражает то, что вы ищете, тогда, пожалуйста, добавьте пример состояния данных и желаемый результат, и мы можемпосмотрите, возможно ли это сделать.

...