Отфильтровать включенное свойство, используя EF Core? - PullRequest
1 голос
/ 21 апреля 2020

В настоящее время я создаю пивной веб-сайт и хочу отфильтровать пиво по стилю, используя простой запрос, подобный следующему:

IQueryable<Beer> result = this.context.Beers
                                      .Include(b => b.Brewery)
                                      .Include(b => b.Style)
                                      .Include(b => b.Reviews)
                                      .ThenInclude(r => r.User)
                                      .Where(b => b.IsDeleted == false);

if (searchCriteria != null)
{
    if (type == "Name")
    {
        result = result.Where(b => b.Name.Contains(searchCriteria));
    }
    else if (type == "Style")
    {
        result = result.Where(b => b.Style.Name.Contains(searchCriteria));
    }
    else
    {
        result = result.Where(b => b.Brewery.Name.Contains(searchCriteria));
    }
}

Однако при его выполнении я получаю 0 результатов, так как запрос не был материализованный и свойство Style имеют значение null, даже если они были включены.

Как обойти эту проблему?

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Чтобы материализовать запрос, просто добавьте .ToList().

Итак, в конце фрагмента вы можете использовать

result.ToList()

Будьте осторожны, некоторые из условий в Ваши предложения Where могут привести к потенциальным проблемам с производительностью. Не забывайте создавать индексы, особенно если ваша БД станет большой.

Обратите внимание, что вам также не следует материализовать использование ToList() слишком рано (до критериев поиска), потому что это будет означать, что нужно взять все таблица в памяти перед фильтрацией.

1 голос
/ 21 апреля 2020

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

IQueryable<Beer> result = this.context.Beers.Where(b => b.IsDeleted == false);

if (searchCriteria != null)
{
    if (type == "Name")
    {
        result = result.Where(b => b.Name.Contains(searchCriteria));
    }
    else if (type == "Style")
    {
        result = result.Where(b => b.Style.Name.Contains(searchCriteria));
    }
    else
    {
        result = result.Where(b => b.Brewery.Name.Contains(searchCriteria));
    }
}

List<Beer> materialisedResults = result
                                   .Include(b => b.Brewery)
                                   .Include(b => b.Style)
                                   .Include(b => b.Reviews)
                                   .ThenInclude(r => r.User).ToList();
0 голосов
/ 21 апреля 2020

Сначала проверьте, все ли данные поступили на результат или нет, затем .ToList () будет выполнен для сохранения всех данных в результате, затем вы можете выполнить запрос.

var result = this.context.Beers
                         .Include(b => b.Brewery)
                         .Include(b => b.Style)
                         .Include(b => b.Reviews)
                         .ThenInclude(r => r.User)
                         .Where(b => b.IsDeleted == false).ToList();

            if (searchCriteria != null)
            {
                if (type == "Name")
                {
                    result = result.Where(b => b.Name.Contains(searchCriteria));
                }
                else if (type == "Style")
                {
                    result = result.Where(b => b.Style.Name.Contains(searchCriteria));
                }
                else
                {
                    result = resultWhere(b => b.Brewery.Name.Contains(searchCriteria));
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...