2014-11-12 3 views
3

У меня есть сетка telerik, которую я привязываю к списку объектов на странице. Пользователи могут группировать столбцы по своему вкусу при просмотре данных. Я пишу функцию для экспорта этих данных в документ excel и хотел бы сохранить группировку, которую пользователь имеет на странице. Я могу получить имена строк свойств моих объектов, которые пользователь сгруппировал.Группировка несколькими ключами, известными во время выполнения

Я застрял в том, как выполнять группировку во время выполнения. Существует множество примеров, таких как: Group by with multiple columns using lambda, описывающие группировку по нескольким свойствам во время компиляции, когда вы знаете заранее. Однако я не знаю, с чем группироваться, пока в течение времени выполнения.

Есть ли какие-либо предложения по поводу группировки во время выполнения?

+0

Linq не предоставляет методы группировки по именам полей. Вы должны использовать выражения. Однако вы можете построить выражение во время выполнения по имени поля. – neleus

ответ

0

Я хотел бы сделать это с помощью Dynamic Linq (http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library)

Пример:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Linq.Dynamic; //have to install this via nuget or download it 

public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime DOB { get; set; } 
} 


class Program { 
    static void Main(string[] args) { 
     var peeps = new List<Person>{ 
      new Person(){ FirstName="Tim", LastName="Smith", DOB = DateTime.Now}, 
      new Person(){ FirstName="Tim", LastName="Smith", DOB = DateTime.Now.AddDays(1)}, 
      new Person(){ FirstName="Mike", LastName="Smith", DOB = DateTime.Now.AddDays(2)}, 
      new Person(){ FirstName="Frank", LastName="Jones", DOB = DateTime.Now.AddDays(3)}, 
     }; 

     var eq = peeps.GroupBy("new (LastName, FirstName)", "it").Select("new(it.Key as Key, it as People)"); ; 
     foreach (dynamic el in eq) { 
      Console.WriteLine(el.Key); 
      foreach (var person in el.People as IEnumerable<Person>) { 
       Console.WriteLine(person.LastName + " " + person.DOB); 
      } 
     }    
    } 
} 
+0

Я использую ваше предложение в своем коде, и я получаю какое-то поведение, которого я не понимаю. Если у меня есть: 'systemList.GroupBy (" new ("+ String.Join (", ", groupFields) +") "," it "). Выберите (" new (it.Key as Key, it as System) "); он будет работать нормально, но если я заменил его на sys следующим образом: 'systemList.GroupBy (" new ("+ String.Join (", ", groupFields) +") "," sys "). Выберите («new (sys.Key as Key, sys as System)»; «Я получаю« Нет свойства или поля «sys» в исключении типа «SystemSummaryData». Как изменилось это на sys, вызвав это? – Justin

+0

О, так видимо, это ключевое слово в динамическом linq. Неважно... – Justin

2

Вы, вероятно, ищете что-то вроде ответа на this SO question, в частности:

var myData = gridData.AsEnumerable() 
        .GroupBy(r => r, new MyDataComparer(keys)) 
        .ToList(); 

internal class MyDataComparer : IEqualityComparer<MyDataType> 
{ 
    private readonly string[] _keys; 

    public MyDataComparer(string[] keys) 
    { 
     _keys = keys; // keep the keys to compare by. 
    } 

    public bool Equals(MyDataType x, MyDataType y) 
    { 
     // a simple implementation that checks if all the required fields 
     // match. This might need more work. 
     bool areEqual = true; 
     foreach (var key in _keys) 
     { 
      areEqual &= (x[key].Equals(y[key])); 
     } 
     return areEqual; 
    } 

    public int GetHashCode(DataRow obj) 
    { 
     // Add implementation here to create an aggregate hashcode. 
    } 
}  
0

Вы 'пытаюсь группировать по имени определенного свойства, которое у вас есть во время выполнения. Это похоже на это, за исключением того, что оно фиксировано на 2 фильтрах. Это просто еще один вариант для вас. используйте панель linq, чтобы проверить ее.

Является ли количество фильтров фиксированным или динамическим?

void Main() 
{ 
    var mySchool = new List<School>{ 
    new School{Student = "Student A", Teacher = "Teacher A", Subject = "Math", Grades = 80}, 
    new School{Student = "Student B", Teacher = "Teacher A", Subject = "Math", Grades = 65}, 
    new School{Student = "Student C", Teacher = "Teacher A", Subject = "Math", Grades = 95}, 
    new School{Student = "Student A", Teacher = "Teacher B", Subject = "History", Grades = 80}, 
    new School{Student = "Student B", Teacher = "Teacher B", Subject = "History", Grades = 100}, 
    new School{Student = "Student A", Teacher = "Teacher C", Subject = "English", Grades = 100}, 
    new School{Student = "Student C", Teacher = "Teacher B", Subject = "English", Grades = 100}, 
    new School{Student = "Student D", Teacher = "Teacher B", Subject = "English", Grades = 90}, 
    }; 


    GroupByFilters("Teacher", "Subject", mySchool); 
    GroupByFilters("Subject", "Teacher", mySchool); 
} 



public void GroupByFilters(string filter1, string filter2, List<School> school) 
{ 

    PropertyInfo prop1 = typeof(School).GetProperties() 
             .Where(x => x.Name == filter1) 
             .First(); 

    PropertyInfo prop2 = typeof(School).GetProperties() 
             .Where(x => x.Name == filter2) 
             .First();         
    var grouping = from s in school 
        group s by new {filter1 = prop1.GetValue(s), filter2 = prop2.GetValue(s)} into gr 
        select new { 
        Filter1 = gr.Key.filter1, 
        Filter2 = gr.Key.filter2, 
        TotalGrades = gr.Sum(x => x.Grades), 
        Count = gr.Count(), 
        Average = gr.Average(x => x.Grades) 
        }; 
    grouping.Dump(); // Linq pad specific 
} 

// Define other methods and classes here 
public class School{ 
    public string Student {get;set;} 
    public string Teacher {get;set;} 
    public string Subject {get;set;} 
    public int Grades {get;set;} 
} 

Фильтр1 Filter2 TotalGrades граф Среднее

Преподаватель по математике 240 3 80

учитель B История 180 2 90

Преподаватель С Английский 100 1 100

Преподаватель B английского языка 190 2 95


Фильтр1 Filter2 TotalGrades граф Среднее

учитель математики A 240 3 80

Учитель истории Б 180 2 90

преподаватель английского языка C 100 1 100

преподаватель английского языка B 190 2 95

Смежные вопросы