Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# Average和Sum不适用于匿名类型?_C#_.net_Linq_Ienumerable - Fatal编程技术网

C# Average和Sum不适用于匿名类型?

C# Average和Sum不适用于匿名类型?,c#,.net,linq,ienumerable,C#,.net,Linq,Ienumerable,抱歉,如果已经有人问过这个问题,但我找不到。似乎Average和Sum在匿名类型中不起作用。我已经尝试了一段时间来让这个代码工作,但没有运气。我正在做的查询是: var trainingPlan = (from tp in context.TPM_TRAININGPLAN join tpd in context.TPM_TRAININGPLANDELIVERABLES on tp.TRAININGPLANID equals tpd.TRAININGPLAN

抱歉,如果已经有人问过这个问题,但我找不到。似乎Average和Sum在匿名类型中不起作用。我已经尝试了一段时间来让这个代码工作,但没有运气。我正在做的查询是:

var trainingPlan = (from tp in context.TPM_TRAININGPLAN
                    join tpd in context.TPM_TRAININGPLANDELIVERABLES on tp.TRAININGPLANID equals tpd.TRAININGPLANID
                    join t in context.TPM_TASK on tpd.TASKID equals t.TASKID
                    where tp.TPM_PROJECTVERSION.PROJECTID == projectId && tp.TPM_PROJECTVERSION.VERSIONID == versionId && tp.TRAININGPLANTYPE == "prescribed"
                    select new
                    {
                        CourseLength = tp.COURSELENGTHHOUR * 60 + tp.COURSELENGTHMINUTE,
                        DeliveryMethod = tp.TPM_DELIVERYMETHODS.NAME,
                        CourseCode = t.COURSECODE
                    });
现在,我想取CourseLength属性的一个和,所以我:

int sum = trainingPlan.Sum(l => l.CourseLength.Value);
但是,“总和”最终为0。与“平均”相同。在调试器下,我可以清楚地看到培训计划有两个项目,一个是CourseLength=90,另一个是CourseLength=150


Sum对这些类型的枚举不起作用吗?谢谢

这肯定是数据库提供商的问题吗?因为这是一个小集合,您可以执行trainingPlan.AsEnumerable().Sum。或者,如果要进行多个计算,请执行trainingPlan.ToList(),将其存储并在计算中使用

这肯定是数据库提供商的问题吗?因为这是一个小集合,您可以执行trainingPlan.AsEnumerable().Sum。或者,如果要进行多个计算,请执行trainingPlan.ToList(),将其存储并在计算中使用

这很好用:

class Program {
    static void Main(string[] args) {
        var stuff = from i in new double[] { 1, 2, 3 }
                    select new {
                        Value = (int) i,
                    };

        var sum = stuff.Sum( s => s.Value);
        Console.WriteLine(sum);
    }
}
因此,请尝试:

select new
                    {
                        CourseLength = (int) tp.COURSELENGTHHOUR * 60 + tp.COURSELENGTHMINUTE,
                        DeliveryMethod = tp.TPM_DELIVERYMETHODS.NAME,
                        CourseCode = t.COURSECODE
                    });

and int sum = trainingPlan.Sum(l => l.CourseLength);
这很好:

class Program {
    static void Main(string[] args) {
        var stuff = from i in new double[] { 1, 2, 3 }
                    select new {
                        Value = (int) i,
                    };

        var sum = stuff.Sum( s => s.Value);
        Console.WriteLine(sum);
    }
}
因此,请尝试:

select new
                    {
                        CourseLength = (int) tp.COURSELENGTHHOUR * 60 + tp.COURSELENGTHMINUTE,
                        DeliveryMethod = tp.TPM_DELIVERYMETHODS.NAME,
                        CourseCode = t.COURSECODE
                    });

and int sum = trainingPlan.Sum(l => l.CourseLength);

Sum()
绝大多数情况下都适用于匿名类型-尤其是在这种情况下,当匿名类型在某个时候被转换为SQL时,它就不起作用了。所以你是说,如果它通过DB提供程序进行查询,它就不起作用了?在这种情况下,我是否可以“查询”所有内容,然后脱机“平均”这些数字,而不是让DB来执行?您使用的是哪种LINQ提供程序(EF、LINQ到SQL…)?你能看看生成的SQL吗?Oracle 11.1和OraDirect-我不知道有什么方法可以实际查看生成的SQL,但我又不是Oracle专家。看起来CourseLength是一个可为空的类型。。。我对LINQ to SQL没有任何经验,但您是否尝试过
int sum=trainingPlan.sum(l=>l.CourseLength)?或者
int sum=trainingPlan.Where(l=>l.CourseLength.HasValue).sum(l=>l.CourseLength.Value)怎么样
Sum()
在匿名类型上非常有效-尤其是在这种情况下,当匿名类型在某个时候被转换为SQL时,它就不起作用了。所以你是说,如果它通过DB提供程序进行查询,它就不起作用了?在这种情况下,我是否可以“查询”所有内容,然后脱机“平均”这些数字,而不是让DB来执行?您使用的是哪种LINQ提供程序(EF、LINQ到SQL…)?你能看看生成的SQL吗?Oracle 11.1和OraDirect-我不知道有什么方法可以实际查看生成的SQL,但我又不是Oracle专家。看起来CourseLength是一个可为空的类型。。。我对LINQ to SQL没有任何经验,但您是否尝试过
int sum=trainingPlan.sum(l=>l.CourseLength)?或者
int sum=trainingPlan.Where(l=>l.CourseLength.HasValue).sum(l=>l.CourseLength.Value)怎么样?是的,当我转换为ToList()时,它就工作了!所以我猜Oracle DB提供程序不支持这种查询。无论如何,我真的不喜欢这些调用执行“新查询”的想法,所以我认为这是一个更好的解决方案,不管提供者的bug如何。一个问题,ToList返回什么数据类型?如果我想将ToList()存储为一个单独的变量,如何声明它?这是一个匿名类型的列表?哦,对不起,duh:var List=trainingPlan.ToList();好答案:我总是忘记linq中的延迟执行。有关投影是什么的信息,请查看:是的,当我转换为ToList()时,它会工作!所以我猜Oracle DB提供程序不支持这种查询。无论如何,我真的不喜欢这些调用执行“新查询”的想法,所以我认为这是一个更好的解决方案,不管提供者的bug如何。一个问题,ToList返回什么数据类型?如果我想将ToList()存储为一个单独的变量,如何声明它?这是一个匿名类型的列表?哦,对不起,duh:var List=trainingPlan.ToList();好答案:我总是忘记linq中的延迟执行。有关投影的信息,请查看: