Свести IQueryable от IQueryable> IQueryable <object> - PullRequest
0 голосов
/ 25 мая 2018

У меня проблема с преобразованием IQueryable<IGrouping<int, object>> в IQueryable<object>.

Объект является классом со свойством int Index.Ключ IGrouping's - это индекс.Я хочу получить объединенный IQueryable<object>, где рассматривается только самый низкий индекс.

Например, несколько группировок с

  • IGrouping<3, object>
  • IGrouping<4, object>
  • IGrouping<4, object>
  • IGrouping<5, object>
  • IGrouping<6, object>
  • IGrouping<3, object>
  • IGrouping<3, object>

Результат должен быть IQueryable<object>, где только объекты с индексом 3 находятся внутри.

PS Мне нужно IQueryable, чтобы выполнить DateTime DbFunctions на нем.Надеюсь, это можно сделать одним SQL-запросом.

Ответы [ 4 ]

0 голосов
/ 28 мая 2018

На самом деле я наконец нашел подходящее решение.Проблема с предыдущими ответами всегда заключалась в вызове First().

list.Where(SomeFilterExpression)
    .GroupBy(e => e.Index)
    .OrderBy(g => g.Key)
    .Take(1)
    .SelectMany(g => g.Select(e => e))
    .Where(SomeAdditionalFilterExpression)
    .ToList()

Этот код (особенно Take() помог мне решить мою проблему, используя только один запрос SQL). В любом случае, спасибодля вашей экспертизы.

0 голосов
/ 25 мая 2018

Чтобы сгладить группы, как описано, вам необходимо:

  1. Сортировать объекты в каждой группе по индексу
  2. Получить первый верхний объект из каждой группы

Этот пример кода демонстрирует запрос LINQ:

IQueryable<MyObject> objects = new[]
{
    new MyObject{ GroupId = 3, Index = 31, OtherProperty = "Group 3 / Index 31" },
    new MyObject{ GroupId = 3, Index = 32, OtherProperty = "Group 3 / Index 32" },
    new MyObject{ GroupId = 3, Index = 32, OtherProperty = "Group 3 / Index 32" },
    new MyObject{ GroupId = 4, Index = 43, OtherProperty = "Group 4 / Index 43" },
    new MyObject{ GroupId = 4, Index = 42, OtherProperty = "Group 4 / Index 42" },
    new MyObject{ GroupId = 4, Index = 45, OtherProperty = "Group 4 / Index 45" },
    new MyObject{ GroupId = 4, Index = 46, OtherProperty = "Group 4 / Index 46" },
    new MyObject{ GroupId = 5, Index = 51, OtherProperty = "Group 5 / Index 51" },
    new MyObject{ GroupId = 5, Index = 54, OtherProperty = "Group 5 / Index 54" },
    new MyObject{ GroupId = 6, Index = 67, OtherProperty = "Group 6 / Index 67" },
    // ...                                                                    
    new MyObject{ GroupId = 6, Index = 63, OtherProperty = "Group 6 / Index 63" }
}.AsQueryable();

IQueryable<IGrouping<int, MyObject>> groups = objects.GroupBy(o => o.GroupId);

IQueryable<MyObject> outcome = groups.Select(grouping => grouping.OrderBy(g => g.Index).First());

List<MyObject> outcomeList = outcome.ToList();

// outcomeList contains: 
// new MyObject{ GroupId = 3, Index = 31, OtherProperty = "Group 3 / Index 31" };
// new MyObject{ GroupId = 4, Index = 42, OtherProperty = "Group 4 / Index 42" };
// new MyObject{ GroupId = 5, Index = 51, OtherProperty = "Group 5 / Index 51" };
// new MyObject{ GroupId = 6, Index = 63, OtherProperty = "Group 6 / Index 63" };
0 голосов
/ 25 мая 2018

SelectMany

выровняется, затем вы можете снова отсортировать и получить заказ по результату, первый или последний.Но для Предметов в Группах, чтобы возвратить единственный набор результатов, SelectMany есть

0 голосов
/ 25 мая 2018

Вы можете использовать сортировку своих групп с помощью OrderBy, а затем взять первую группу с FirstOrDefault

var firstGroup = list.GroupBy(x => x.Index)
  .OrderBy(g => g.Key)
  .FirstOrDefault()
  .AsQueryable();

Пожалуйста, посмотрите пример

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