Вот код примера, почему-то возвращается пустая запись, не могу понять где ошибка, вроде все логично.
И второй вопрос — может как-то можно проще оформить, особенно вывод 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();
}