新手C#,资深DBA和LINQ的新手。我试图了解为什么groupBy上下文中的select子句返回类型名称(在本例中为“ System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [CasesReportParser.Requisition,System.String]”),而不是字段值。
我认为,我的最终困惑是,一般情况下,如何在groupBy结果中包含其他字段,而这些其他字段未分组(在g.Key中则不可用)。
这是代码,它是返回类型名称的最后一行的条件ExamType。谢谢。
var ListFinal = rows
.GroupBy(l => new { ExamDate = ParseDate(l.ExamDate), l.PatientID, l.PatientFirst, l.PatientLast, l.Birthdate, l.SiteName })
.Select(g => new {
//ExamDate = g.Select(l => l.ExamDate),//.ToString().Substring(0,10), //.ToString().Split(' ')[0]
ExamDate = g.Key.ExamDate,
PatientID = g.Key.PatientID,
PatientFirst = g.Key.PatientFirst,
PatientLast = g.Key.PatientLast,
Birthdate = g.Key.Birthdate,
SiteName = g.Key.SiteName,
ReqCount = g.Select(l => l.RequisitionNumber).Distinct().Count(),
ExamCount = g.Select(l => l.ExamID).Distinct().Count(),
ExamType = (g.Select(l => l.ExamID).Distinct().Count()>1 ? "multiple" : g.Select(l => l.ExamType).ToString())
});
答案 0 :(得分:3)
您可能要添加.First
,因为它正在返回集合。
g.Select(l => l.ExamType).First().ToString()
答案 1 :(得分:0)
Select
中的第一个根本不返回任何个元素。实际上,它甚至不返回集合,而是可以迭代集合的迭代器。
因此,仅在集合上调用Select
根本不会做任何事情,仅在该迭代器上调用MoveNext
会执行查询。这可以通过许多不同的方法来完成,其中一种方法是调用First
或FirstOrDefault
,这似乎是您应该使用的方法。如果没有返回任何元素,First
将引发异常,但是FirstOrDefault
将返回迭代器类型的默认值(对于引用类型,返回null
)。
话虽如此,您可能需要在Select
中使用它:
ExamType = g.Select(l => l.ExamID).Distinct().Count() > 1 ?
"multiple" :
g.FirstOrDefault(l => l.ExamType)?.ToString()
由于FirstOrDefault
可能返回null
,因此您会收到NullReferenceException,这就是为什么您应该使用?.-operator的原因。