无法访问 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 的多个联接访问字段

C# 3.0 LINQ的准备工作

在LINQ查询中使用GROUPBY时,无法转换LINQ表达式的GroupByShaperExpression:

c# linq groupby是默认去掉重复行吗