好的,所以这可能是因为不知道如何正确使用EF核心,因为这是我第二天使用但我似乎必须运行.Include()
才能查询此方法创建的“内部联接” 。
我有点工作并过滤掉我的结果,但我不想返回模型中的include,因为它将256kb的JSON响应变成了2.8Mb的JSON响应。
public IEnumerable<Property> GetFeaturedProperties()
{
var properties = _db.Properties
.Include(p => p.GeoInfo)
.Include(p => p.FeaturedUntil)
.ToArray();
var featuredProperties = new List<Property>();
var DateTimeNow = DateTime.Now;
var midnightToday = DateTimeNow.AddHours(-DateTimeNow.Hour)
.AddMinutes(-DateTimeNow.Minute)
.AddSeconds(-DateTimeNow.Second-1);
for (var i = 0; i < properties.Count(); i++)
{
var property = properties[i];
if(property.FeaturedUntil.Any(p => p.FeaturedDate >= midnightToday))
featuredProperties.Add(property);
}
return featuredProperties;
}
因此违规行为.Include(p => p.FeaturedUntil)
。因为这是一个日期数组,每个连接行可以有10-1000行。它包括所有数据,甚至是历史数据,所以这实际上是数据存储。
我可以运行查询,然后运行某些内容到.RemoveInclude(p => p.FeaturedUntil)
吗?
答案 0 :(得分:2)
您无需加载导航属性即可应用过滤。当您访问LINQ to Entities查询中的导航属性时,它将被转换为相应的SQL构造,包括JOIN
。不涉及真实的对象/集合。整个查询(有一些例外)在服务器(数据库)端执行。
在您的情况下,以下简单查询将完成此任务:
public IEnumerable<Property> GetFeaturedProperties()
{
var DateTimeNow = DateTime.Now;
var midnightToday = DateTimeNow.AddHours(-DateTimeNow.Hour)
.AddMinutes(-DateTimeNow.Minute)
.AddSeconds(-DateTimeNow.Second-1);
return _db.Properties
.Include(p => p.GeoInfo) // assuming you want to return this data
.Where(p => p.FeaturedUntil.Any(p => p.FeaturedDate >= midnightToday))
.ToList();
}
有关详细信息,请参阅How Queries Work文档主题。