Подвыбор LINQ в таблице с составным ключом - PullRequest
4 голосов
/ 12 мая 2011

У меня есть таблица настроек в базе данных, доступ к которой осуществляется через запросы Entity Framework.Настройки имеют составной ключ: Категория, Группа, Имя, Цель, Изменено.Настройки, очевидно, также содержат неключевые поля, такие как значение.

Как мне написать запрос, который дает мне последние настройки в том же (Категория, Группа, Имя, Цель)?

ПодробнееВ частности, я хочу, чтобы все последние объекты настроек, включая неключевые поля, соответствовали определенной категории, группе, целевой комбинации.

Например: дать мне все последние настройки для всех целей, где категория "База данных "и группа" Тайм-аут ".

Это можно сделать в два этапа: начальный запрос возвращает все ключи [Category, Group, Name, Target, Modified], соответствующие критериям, а затем цикл, запрашивающий настройку для каждого ключа, но это приведет кмного запросов к базе данных, создающих накладные расходы.

Как бы я сделал это с LINQ, если я хочу минимизировать количество запросов к базе данных SQL, выполняемых платформой?

Ответы [ 2 ]

3 голосов
/ 12 мая 2011
var query = from s in db.Settings
            group s by new
            {
              s.Category,
              s.Group,
              s.Name,
              s.Target,
            } into sg
            select new
            {
              Setting = sg.OrderByDescending(r => r.Modified).FirstOrDefault()
            };

Редактировать - если вы хотите вернуть список настроек

 List<Setting> list = (from s in db.Settings
                       group s by new
                       {
                         s.Category,
                         s.Group,
                         s.Name,
                         s.Target,
                       } into sg
                       select sg.OrderByDescending(r => r.Modified).FirstOrDefault()
                      ).ToList();
1 голос
/ 13 мая 2011

Попробуйте использовать следующую инструкцию LINQ.

        List<Settings> latestSettings = 
            db.Settings.OrderByDescending(x => x.Modified).GroupBy(x => new {x.Category, x.Group, x.Name, x.Target}, x => x)
            .Select(result => result.FirstOrDefault())
            .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...