无法访问 groupBy 数据 Linq C#
Posted
技术标签:
【中文标题】无法访问 groupBy 数据 Linq C#【英文标题】:Cannot access groupBy data Linq C# 【发布时间】:2021-09-13 08:20:35 【问题描述】:在方法内部,我有一个包含分组数据的列表:
var listofData = _context.DBONE.where(x => x.Id==3 && x.Status!=0)
.GroupBy(x => new x.Name, x.Class )
.Select(q => new Result = q.ToList() ).ToList();
if (methodParam == 10)
data = listofData.Where(x => FunctionCheck(---CANNOT ACCESS THE FIELDS FROM GROUP DATA TO PASS AS PARAMETERS---) == 10).ToList();
这是将从分组数据中接收2个参数的函数:
private int FunctionCheck(int id, string name)
...
但是,我无法访问“listofData”中的所需字段。我只能在 listofData 不使用 groupBy() 的情况下访问。
【问题讨论】:
呃,您如何尝试访问该数据?请说明您在哪里调用FunctionToCheck
以及您如何提供参数。此外,您的班级结构会很有帮助
@HimBromBeere 已编辑!
@Valkyrie_30 你应该可以毫无问题地调用 x.Result
@moozywu 是的,我做到了。但后来我不得不使用 FirstOrDefault() 来访问后来显示 Error CS1662 的必填字段
您能否提供一个minimal reproducible example,它将包括所有类型和一些数据作为有效的 C# 代码?
【参考方案1】:
如果我理解您正在尝试正确执行的操作,则您可以访问您的数据,但您实际上是在创建“列表列表”
看我的例子,我想我在这里复制了你的场景:
如您所见,然后我有一个“结果”,其中包含 Id == 3 的用户列表。问题是您创建了一个新的匿名对象,其中的道具是一个列表。因此,如果您尝试在上图中看到的最后一件事,我认为您将能够访问您的行。
【讨论】:
【参考方案2】:原因是在您的 GroupBy 调用之后,结果属于分组类型 - 列表中的每个项目都是原始项目的 Enumerable,因此您必须按以下方式对该分组进行操作:
// Groups such that all items in that group pass your check
listofData
.Where(group => group.All(item => FunctionCheck(item.Id, item.Name) == 10))
.ToList();
// Groups where at least one item matches
listofData
.Where(group => group.Any(item => FunctionCheck(item.Id, item.Name) == 10))
.ToList();
从问题中并不清楚期望的结果,但这是您可能缺少的步骤。
另一种可能有用的方法是在对项目进行分组之前对其进行预过滤:
var listOfGroupedDatas = _context.DBONE
.Where(x => x.Id ==3 && x.Status != 0 && FunctionCheck(item.Id, item.Name) == 10)
.GroupBy(x => new x.Name, x.Class )
.ToList();
// This will result in a list of groupings in which all items pass your check
【讨论】:
【参考方案3】:我想你想调用 SelectMany 来投影到一维数组中。
var listofData = _context.DBONE.where(x => x.Id==3 && x.Status!=0)
.GroupBy(x => new x.Name, x.Class )
.SelectMany(q => q.ToList()).ToList();
【讨论】:
将初始集合分组然后立即将其展平是很奇怪的,你不觉得吗?以上是关于无法访问 groupBy 数据 Linq C#的主要内容,如果未能解决你的问题,请参考以下文章
C# 无法访问 Newtonsoft.Json.Linq.JProperty 上的子值
System.Core 错误:使用 C# Entity Framework 和 Linq 和 Expression 的“代码应该无法访问”
无法使用 group by 和使用 linq 的多个联接访问字段