猿问

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

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

                });


慕仙森
浏览 161回答 2
2回答

慕码人2483693

您可能想要添加.First,因为它正在返回一个集合。g.Select(l => l.ExamType).First().ToString()

ITMISS

First of根本Select不返回任何元素。事实上,它甚至不返回一个集合,而是一个可以迭代集合 的迭代器。所以仅仅调用Select一个集合根本不会做任何事情,只有调用MoveNext那个迭代器才会执行查询。这可以通过许多不同的方式来完成,其中一种是通过调用Firstor 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的原因。
随时随地看视频慕课网APP
我要回答