Как бы я использовал анонимный тип результата для делегата выражения для LINQ to SQL? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть существующий запрос LINQ to SQL, где я пытаюсь разрешить различные группировки:

var result= dc.Report_Data
                .Where(x => x.Year == Year)
                .Where(x => x.Month >= Month)
                .GroupBy(grouping)
                .Select(g => new ReportViewModel(){
                    Month = g.Key.Month,
                    Option1 = g.Key.Option1, 
                    Option2 = g.Key.Option2,
                    Amount = g.Sum(x => x.Amount)
                })
                .ToList();

Мне нужно разрешить группировать различные наборы свойств на основе внешнего параметра,Я устанавливаю значение по умолчанию, затем использую условные выражения, например:

Expression<Func<Report_Data, TResult>> grouping = g => new {g.Month, Option1 = g.prop1, Option2 = g.prop2};

if (userParameter == "X"){
    grouping = g => new {g.Month, Option1 = g.prop3, Option2 = g.prop4};
} else if (userParameter == "Y") {
    grouping = g => new {g.Month, Option1 = g.prop5, Option2 = g.prop6};
}

Затем я передаю grouping в приведенный выше запрос. Проблема в том, что у меня есть анонимный тип в группировке и Expression<Func<Report_Data, TResult>> ошибки, когда я использую TResult в качестве Типа результата.

Есть ли способ использовать этот формат делегата выражения и указать общий или анонимный тип результата? (желательно без необходимости создавать класс для каждого типа результата) Или я должен разрешить различные группировки по другому механизму?

1 Ответ

0 голосов
/ 23 октября 2019

Следуя объяснению из этого поста в блоге о построении запросов LINQ , я нашел следующее решение:

Расширение LINQ:

public static class Linq {
    public static Expression<Func<T, R>> 
        Expr<T, R>(Expression<Func<T, R>> f) {
        return f;
    }
}

Группировка можетзатем установите так:

var grouping = Linq.Expr((Report_Data g) => new {g.Month, Option1 = g.prop1, Option2 = g.prop2});

if (userParameter == "X") {
    grouping = Linq.Expr((Report_Data g) => new {g.Month, Option1 = g.prop3, Option2 = g.prop4});
} else if(userParameter == "Y") {
    grouping = Linq.Expr((Report_Data g) => new {g.Month, Option1 = g.prop5, Option2 = g.prop6});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...