Помогите с простым запросом Linq
От: Аноним  
Дата: 11.06.10 14:03
Оценка:
Вот код примера, почему-то возвращается пустая запись, не могу понять где ошибка, вроде все логично.

И второй вопрос — может как-то можно проще оформить, особенно вывод writeline

        static void Main(string[] args)
        {

            /// Задача :
            /// Нужно выбрать записи :
            /// 1.  d = 1
            /// 2.  значение b в результирующей выборке должно быть уникальным, 
            /// из множества строк с одинаковым b  нужно оставить одну строку 
            /// у которой максимальное a
            /// т.е. на выходе должны остаться 2 строки
            /// new { a = 2, b = 1, c = 4, d = 1 },
            /// new { a = 6, b = 2, c = 1, d = 1 }

            

            var data = new [] 
            {
                new { a = 1, b = 1, c = 3, d = 1 },
                new { a = 2, b = 1, c = 4, d = 1 },
                new { a = 3, b = 1, c = 5, d = 2 },
                new { a = 4, b = 2, c = 2, d = 1 },
                new { a = 5, b = 2, c = 4, d = 1 },
                new { a = 6, b = 2, c = 1, d = 1 },
            };


           /// Решение :
            /// Запросом  data.Where(max => max.b == d.b).Max(m => m.a) отбираем записи из data
            /// у которых значение max.b равно текущему d.b и находим максимальное m.a для текущего d.b
            /// далее запросом
            /// where (d.d == 1) && (d.a == data.Where(max => max.b == d.b).Max(m => m.a) )
            /// отбираем значения с d =1 и только те у которых d.a = максимальному a в рамках одного b
            var res =
                from d in data
                where (d.d == 1) && (d.a == data.Where(max => max.b == d.b).Max(m => m.a) )
                select new { d.a, d.b, d.c, d.d };


            res.Aggregate((acc, exp) =>
            {
                Console.WriteLine(string.Format("a = {0} , b = {1}, c  = {2}, d = {3}",
                    exp.a, exp.b, exp.c, exp.d)); return exp;
            });
            
            Console.ReadKey();


        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.