linq groupby加选择返回的元素类型而不是值

时间:2018-12-19 14:15:55

标签: c# linq

新手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())
                });

2 个答案:

答案 0 :(得分:3)

您可能要添加.First,因为它正在返回集合。

g.Select(l => l.ExamType).First().ToString()

答案 1 :(得分:0)

Select中的第一个根本不返回任何个元素。实际上,它甚至不返回集合,而是可以迭代集合的迭代器

因此,仅在集合上调用Select根本不会做任何事情,仅在该迭代器上调用MoveNext会执行查询。这可以通过许多不同的方法来完成,其中一种方法是调用FirstFirstOrDefault,这似乎是您应该使用的方法。如果没有返回任何元素,First将引发异常,但是FirstOrDefault将返回迭代器类型的默认值(对于引用类型,返回null)。

话虽如此,您可能需要在Select中使用它:

ExamType = g.Select(l => l.ExamID).Distinct().Count() > 1 ? 
                                   "multiple" : 
                                   g.FirstOrDefault(l => l.ExamType)?.ToString()

由于FirstOrDefault可能返回null,因此您会收到NullReferenceException,这就是为什么您应该使用?.-operator的原因。