Необязательная динамическая группировка по многим с помощью linq
Привет,
Я столкнулся с проблемой динамической группировки.
У меня есть требование, когда кнопки перетаскиваются для группировки для создания отчета
Я попробовал использовать
динамический linq- Я не хочу использовать магическую нить.Поэтому я решил потратить больше времени и получить что-то без использования струн.
Я нашел C# 6.0 в двух словах-PredicateBuilder[^] и
другое расширение c# 3.0-Как я могу иерархически группировать данные с помощью LINQ? - переполнение стека[^]
Но GroupByMany в расширении имеет делегат как функцию, а не выражение.
Так что я не мог попробовать, как
<pre lang="c#"><pre lang="c#"><pre lang="text">
foreach (var entry in resultEntries) { if (projectGroup) predicate1 = predicate.And(p => p.Project.Id == entry.Project.Id); if (clientGroup) predicate2 = predicate.And(p => p.Client.Id == entry.Client.Id); if (userGroup) predicate3 = predicate.And(p => p.User.Id == entry.User.Id); predicateResult.And(predicate1); predicateResult.And(predicate2); predicateResult.And(predicate3);
}
var output = resultEntries.GroupByMany(predicate);
Экс:Жестко закодированный тип для одного сценария выглядит следующим образом
var nestedGrouping = reportTimeEntries .GroupByMany(t => t.Project.Id, t => t.Client.Id);
Я хочу, чтобы это было динамично.Потому что я не знаю, в каком порядке фильтры отправляются для группировки.
Пожалуйста, помогите мне.Я застрял на последних трех неделях.
Что я уже пробовал:
публичное перечисление eEntry
{
NotSet = 0,
[Описание= " Клиенты"]
Клиенты = 1,
[Описание= " Проекты"]
Проекты = 2,
[Описание= " Пользователи"]
Пользователи=3
}
public void SubmitReport (EntryFilter filter) {//Фильтр содержит группы отчетов и диапазон дат
var reportGroups= "проекты, клиенты"; / / на самом деле должен исходить из фильтра.Но я показываю один сценарий
// Примечание: группы отчетов могут быть 1. Clientslients,
// 2.проекты,
// 3.Пользователи,
// 4.Клиенты, Проекты,
// 5. Проекты, Клиенты
// 6. Клиенты, Пользователи,
// 7. Пользователи, Клиенты,
// ..... прием. со всеми возможными комбинациями, включая опциональные
// Выше используются для группировки моих записей
Список<ввод&ГТ; записи=услуги.очищает основные атрибуты так же();
//Я хочу сгруппировать по идентификаторам группы отчетов
ВАР проект групп = reportGroups.Содержит(eEntry. Projects);
var clientGroup = группы отчетов.Содержит(eEntry.Клиенты);
var userGroup = группы отчетов.Содержит(eEntry.Пользователи);
если (проект групп)
записи.Метод groupBy(е=&ГТ;электронная.Проект.Идентификатор);
if (clientGroup)
записи.Метод groupBy(е=&ГТ;электронная.Клиент.Айди);
если (асэргрупп)
записи.Метод groupBy(е=&ГТ;электронная.Пользователей.Идентификатор);
// и все другие возможные комбинации
}