Запрос EF Core из Включить, но нет необходимости возвращать результат - PullRequest
0 голосов
/ 12 июня 2018

Хорошо, возможно, это из-за того, что я не знаю, как правильно использовать ядро ​​EF, поскольку это мой второй день использования, но мне кажется, что мне нужно запустить .Include(), чтобы выполнить запрос к "внутреннему соединению", которое создает этот метод.

У меня есть этот бит, работающий и фильтрующий мои результаты, но я не хочу возвращать включение в модель, поскольку оно превращает ответ JSON размером 256 КБ в ответ JSON объемом 2,8 МБ.

    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 голосов
/ 12 июня 2018

Вам не нужно загружать свойства навигации, чтобы применить фильтрацию.Когда вы обращаетесь к свойству навигации внутри запроса LINQ to Entities, оно переводится в соответствующую конструкцию SQL, включая JOIN s.Никакие реальные объекты / коллекции не участвуют.Весь запрос (за некоторыми исключениями) выполняется на стороне сервера (базы данных).

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

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();
}

Для получения дополнительной информации см. Как работают запросы тема документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...