来自Include的EF Core查询但不需要返回结果

时间:2018-06-12 19:22:36

标签: c# sql entity-framework entity-framework-core

好的,所以这可能是因为不知道如何正确使用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)吗?

1 个答案:

答案 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文档主题。