Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法将几个受支持的Linq到实体方法提取(重构)到一个方法?_C#_Linq To Entities_Entity Framework 4.1 - Fatal编程技术网

C# 有没有办法将几个受支持的Linq到实体方法提取(重构)到一个方法?

C# 有没有办法将几个受支持的Linq到实体方法提取(重构)到一个方法?,c#,linq-to-entities,entity-framework-4.1,C#,Linq To Entities,Entity Framework 4.1,我有疑问: 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, ... } 它是有效的

我有疑问:

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;
    }
}
我明白为什么我会犯这个错误。 是否有其他方法将Linq 2实体支持的方法组提取到单个方法中?还是我用复制粘贴相同的代码位来堆叠?
Linq 2对象不是选项

您可以先从数据库中获取数据,然后对本地数据使用您的方法:

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

您可以先从数据库中获取数据,然后对本地数据使用您的方法:

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

这在ESQL(复制到多个ESQL查询的内联函数)中是可能的,如果您在可以定义的地方使用EDMX,那么在Linq to实体中也是可能的。正如我所知,code first(=no EDMX)不支持这种方法-在这种情况下,您必须使用@Daniel提到的方法,在这里您具体化结果并使用linq to对象来执行您的方法

这在ESQL(内联函数复制到多个ESQL查询)中是可能的,如果您在可以定义的地方使用EDMX,那么在Linq to实体中也是可能的。正如我所知,code first(=no EDMX)不支持这种方法-在这种情况下,您必须使用@Daniel提到的方法,在这里您具体化结果并使用linq to对象来执行您的方法

我知道LINQtoObject可以处理这个问题,但我不想获取数据,我想使用LINQtoEntity。我不需要马上得到结果,我需要从这个函数返回IQueryable,这样其他函数也可以添加其他东西来转换为sqlI。我知道Linq to Object可以处理这个问题,但我不想获取数据,我想使用Linq to Entity。我不需要立即得到结果,我需要从这个函数返回IQueryable,这样其他函数也可以添加其他可以转换为的内容sql@qrow:那么您就不能重用您的方法。@qrow:那么您就不能重用您的方法。