Entity Framework Core - вызов метода Линк, который не имеет отношений - PullRequest
1 голос
/ 17 июня 2019

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

if(request.MoreThen != null)
            {
                query = query.Where(c =>
                    c.Prices
                    .OrderByDescending(p => p.CreatedAt)
                    .First()
                    .Price
                    >= request.MoreThen);
            }

И все работает хорошо. Однако, когда я пытаюсь извлечь эту функцию в частный метод, я получаю, что отношение Prices равно нулю.

Теперь у меня есть несколько мест, где мне нужна последняя цена, вот второе, если:


            if(request.MoreThen != null)
            {
                query = query.Where(c =>
                    c.Prices
                    .OrderByDescending(p => p.CreatedAt)
                    .First()
                    .Price
                    >= request.MoreThen);
            }

Я считаю, что это совсем не СУХОЙ, поэтому я хотел извлечь извлечение цены в частный метод, например так:

private decimal GetPrice(Coffee model) 
{
  return model.Prices
     .OrderByDescending(p => p.CreatedAt)
     .First()
     .Price
}

Однако теперь, когда я подставляю запрос:

   query = query.Where(c => GetPrice(c) <= request.LessThen)

Я получаю странную ошибку, и в отладчике присутствует каждое поле , за исключением Включено . (Обратите внимание, что я вызвал метод .Include).

Полный пример кода включен в мой открытый исходный код Проект на Github

РЕДАКТИРОВАТЬ: я использую Postgres в качестве движка базы данных, и код первый подход

Итак, мой вопрос: почему значение .Prices равно нулю, хотя я включил их в начале метода?

1 Ответ

1 голос
/ 17 июня 2019

Я не мог понять, как работать с самим классом Coffee, однако вы можете создать метод расширения для IQueryable<Coffee>.

Например:

public static class Extensions
{
    public static IQueryable<Coffee> GetPriceMoreThen(this IQueryable<Coffee> query, decimal moreThen)
    {
        return query.Where(c =>
                           c.Prices
                            .OrderByDescending(p => p.CreatedAt)
                            .First()
                            .Price >= moreThen);
    }
}

который затем вы можете назвать как таковой

query = query.GetPriceMoreThen(request.MoreThen);

Отказ от ответственности: я делаю некоторые предположения о вашей модели здесь

...