Есть ли способ извлечь (реорганизовать) несколько поддерживаемых методов Linq to Entity в один метод? - PullRequest
1 голос
/ 27 мая 2011

У меня есть запрос:

ctx.PrintJobs
.GroupBy(pj => pj.Department.Name)
.Select(g => new PrintJobReportItem
{
    A3SizePercentage = g.Sum(p => p.DocumentSize == "a3" ? p.TotalPhisicalPages : 0d) / g.Sum(p => p.TotalPhisicalPages) * 100,
    ...
}

и все работает.

У меня есть много значений Perecentage для подсчета, поэтому я попытался изменить этот код на:

ctx.PrintJobs
.GroupBy(pj => pj.Department.Name)
.Select(g => new PrintJobReportItem
{
    A3SizePercentage = g.PercentageOf(p => p.DocumentSize == "a3"),
    ...
}
...
public static class GroupingEx
{
    public static double PercentageOf(this IGrouping<string, PrintJobItem> g, Func<PrintJobItem, bool> trueCondition)
    {
        return g.Sum(p => trueCondition(p) ? p.TotalPhisicalPages : 0d) / g.Sum(p => p.TotalPhisicalPages) * 100;
    }
}

Но тогда я получаю ошибку:

System.NotSupportedException : LINQ to Entities does not recognize the method 'Double PercentageOf...

Я понимаю, почему я получаю эту ошибку. Существуют ли другие способы извлечения группы методов, поддерживаемой Linq 2 Entity, в один метод? или я стек с копированием, вставляя те же биты кода? Linq 2 Объект не является опцией

Ответы [ 2 ]

1 голос
/ 27 мая 2011

Это возможно в ESQL (встроенная функция, скопированная в несколько запросов ESQL - пример ), и это возможно с Linq-to-entity, если вы используете EDMX, где вы можете определить определенную моделью функцию.Как я знаю, код сначала (= не EDMX) не поддерживает это - в таком случае вы должны использовать подход, упомянутый @Daniel, где вы материализуете результат и используете linq-to-objects для выполнения вашего метода.

0 голосов
/ 27 мая 2011

Вы можете сначала получить данные из базы данных, а затем использовать свой метод для локальных данных:

ctx.PrintJobs.GroupBy(pj => pj.Department.Name)
             .ToList()
             .Select(g => new PrintJobReportItem
                          {
                              A3SizePercentage = 
                                  g.PercentageOf(p => p.DocumentSize == "a3"),
                              ...
                          }
...