C# Average和Sum不适用于匿名类型?
抱歉,如果已经有人问过这个问题,但我找不到。似乎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
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中的延迟执行。有关投影的信息,请查看: