Выберите первый из каждой IGrouping, агрегируя некоторые свойства без явного назначения каждого неагрегированного свойства - PullRequest
0 голосов
/ 18 сентября 2018

Есть ли способ выбрать первый элемент каждого IGrouping при агрегировании некоторых свойств без явного присвоения каждого неагрегированного свойства в проекции?

Например, SelectAggregatedFirstsOfMyThings() делает то, что мне нужно,Однако в моем реальном сценарии MyThing имеет что-то вроде 30 свойств.Я хочу перенести значения свойств первого в каждом IGrouping без явного объявления MyIntA = x.First().MyIntA для каждого из неагрегированных свойств.Есть ли какой-то другой сокращенный синтаксис для достижения этого (без использования чего-то вроде Automapper)?

public class MyThing {

    public int MyFkId { get; set; }
    public int MyIntA { get; set; }
    public int MyIntB { get; set; }
    public DateTime MyDate {get; set; }
    ...
}

public class MyCaller {
    public IQueryable<MyThing> SelectAggregatedFirstsOfMyThings(IOrderedQueryable<MyThing> myThings) =>
        myThings.GroupBy(t => t.MyFkId)
                .Select(g => new MyThing
                {
                    MyIntA = g.First().MyIntA,
                    MyIntB = g.First().MyIntB,
                    MyDate = g.Max(d => d.MyDate)
                    ...
                }
}

1 Ответ

0 голосов
/ 19 сентября 2018

Вы можете использовать лямбда-оператор для создания нового MyThing, инициализированного из First() группы, а затем переназначить агрегированные свойства, чтобы создать нужный объект.Поскольку вы используете LINQ to SQL, вы должны передать (создать экземпляр) результаты запроса клиенту, используя AsEnumerable перед оператором lambda.

public IQueryable<MyThing> SelectAggregatedFirstsOfMyThings(IOrderedQueryable<MyThing> myThings) =>
    myThings.GroupBy(t => t.MyFkId)
            .AsEnumerable()
            .Select(g => {
                var r = new MyThing(g.First());
                r.MyDate = g.Max(d => d.MyDate);
                // assign remaining aggregated properties ...
                return r;
             });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...