实体框架核心 - 调用 where linq 方法没有关系



我是 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);
}

我发现这根本不是 DRY,所以我想将价格的获取提取到一个私有方法中,如下所示:

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作为数据库引擎,并且代码优先方法

所以我的问题是,为什么即使我在方法的开头包含它们,.Pricesnull?

我不知道如何在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);

免责声明:我在这里对您的模型做出一些假设

最新更新