Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > LINQ - группировка со статистикой по всем колонка


Автор: swetik1981 23.3.2012, 23:15
Имеется таблица в датасете, содержащая некоторые сведения.
Как посредством одного LINQ-запроса (VB.NET) вывести уникальный перечень значений в одном из столбцов таблицы и статистику уникальных значений во всех остальных столбцах?
Чтоб было понятней, пример:

Вот исходная таблица:

Код

Курс      Фам        Имя      Отч        Год

первый    Иванов     Иван     Петрович   1980
второй    Петров     Петр     Петрович   1996
второй    Петров     Сидор    Иванович   1997
третий    Сидоров    Петр     Иванович   1995
первый    Иванов     Сидор    Сидоров    1997
второй    Сидоров    Иван     Иванович   1996



А вот таблица - результат, в которой приведена статистика встречаемости уникальных фамилий, имён, отчеств и годов рождения студентов для каждого из курсов:

Код

Курс      Фам        Имя      Отч       Год

первый    1          2        2         2
второй    2          3        2         2
третий    1          1        1         1



Как такое сделать посредством одного единственного LINQ-запроса (VB.NET) ?

Автор: Kolovorot 23.10.2012, 09:29
Это группировка по одной колонке. Сделал на C# и на примере List<Student>  smile 
Код

 public class Student
    {
        public string Curs { get; private set; }
        public string Surname { get; private set; }
        public string Firstname { get; private set; }
        public string Patronymic { get; private set; }
        public int yearBirthday { get; private set; }

        public Student(string curs, string surname, string firstname, string patronymic, int year)
        {
            this.Curs = curs;
            this.Surname = surname;
            this.Firstname = firstname;
            this.Patronymic = patronymic;
            this.yearBirthday = year;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Student> students = new List<Student>()
            {
                new Student("первый", "Иванов","Иван", "Петрович", 1980),   
                new Student("первый",    "Иванов",     "Иван",     "Петрович",   1980),
                new Student("второй",    "Петров",     "Петр"  ,   "Петрович",   1996),
                new Student("второй",    "Петров",     "Сидор",    "Иванович",   1997),
                new Student("третий",    "Сидоров",    "Петр",     "Иванович",   1995),
                new Student("первый",    "Иванов",     "Сидор",    "Сидоров",    1997),
                new Student("второй",    "Сидоров",    "Иван",     "Иванович",   1996)
            };

           var studentCurses = students.GroupBy(s => s.Curs)
                                        .Select(g => new
                                        {
                                            Curs = g.Key,
                                            SurnameCount = g.Select(s=>s.Surname).Distinct().Count(),
                                            FirstnameCount = g.Select(s=>s.Firstname).Distinct().Count(),
                                            Patronymic = g.Select(s=>s.Patronymic).Distinct().Count(),
                                            Year = g.Select(s=>s.yearBirthday).Distinct().Count()
                                        });

            foreach (var curs in studentCurses)
            {
                Console.WriteLine("{0} {1} {2} {3} {4}", curs.Curs,
                                                curs.SurnameCount,
                                                curs.FirstnameCount,
                                                curs.Patronymic,
                                                curs.Year);
            }

        }


    }

   

    



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)