Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 群内群linq_C#_Linq_Linq To Dataset - Fatal编程技术网

C# 群内群linq

C# 群内群linq,c#,linq,linq-to-dataset,C#,Linq,Linq To Dataset,我有这样一个数据表: First Field | Second Field | Third Field ------------+--------------+---------------- 5 | XXXX |(8) (2,6,3) (9) 5 | KKKK |(8,3) 我想把这张表分成A区和B区, 我的组的第三个字段应该是字段C的列表,但它必须按ID字段分组 最后,结果应该是这样的: First Field

我有这样一个数据表:

First Field | Second Field |  Third Field
------------+--------------+----------------
     5      |     XXXX     |(8) (2,6,3) (9)  
     5      |     KKKK     |(8,3)
我想把这张表分成A区和B区, 我的组的第三个字段应该是字段C的列表,但它必须按ID字段分组

最后,结果应该是这样的:

First Field | Second Field |  Third Field
------------+--------------+----------------
     5      |     XXXX     |(8) (2,6,3) (9)  
     5      |     KKKK     |(8,3)
第三个字段必须是列表列表

我怎样才能和LINQ一起做到这一点

到目前为止,我试过:

        var trytogroup = (from p in datatable.AsEnumerable()
                                group p by new
                                {
                                    ID = p["Id"].ToLong(),
                                    FieldA = p["FieldA"].ToLong(),
                                    FieldB = p["FieldB"].ToString()
                                } into g
                                select new
                                {
                                    FirstField = g.Key.FieldA,
                                    SecondField = g.Key.FieldB,
                                    ThirdField = datatable.AsEnumerable().Where(p => p["FieldA"].ToLong() == g.Key.FieldA && p["FieldB"].ToString() == g.Key.FieldB).Select(p => p["FieldC"].ToLong()).GroupBy(x => x["Id"].ToLong()).Distinct().ToList()
                                });

您的查询有什么问题:

  • 您不需要在第一位按三个字段分组。按ID分组应在按FieldA和FieldB分组的组中进行
  • 当获取第三个字段时,您不需要再次查询datatable—您已经拥有所有必需的数据。您只需要按ID添加分组
正确的查询:

 from r in datatable.AsEnumerable()
 group r by new {
   FieldA = r.Field<long>("FieldA"),
   FieldB = r.Field<string>("FieldB")
 } into g
 select new
 {
     First = g.Key.FieldA,
     Second = g.Key.FieldB,
     Third = g.GroupBy(r => r.Field<long>("ID"))
              .Select(idGroup => idGroup.Select(i => i.Field<long>("FieldC")).ToList())
 }
来自datatable.AsEnumerable()中的r
新成立的r组{
FieldA=r.Field(“FieldA”),
FieldB=r.Field(“FieldB”)
}进入g
选择新的
{
第一个=g.Key.FieldA,
第二个=g.Key.FieldB,
第三个=g.GroupBy(r=>r.Field(“ID”))
.Select(idGroup=>idGroup.Select(i=>i.Field(“FieldC”)).ToList()
}

如果您更喜欢lambdas,您的查询可能如下所示:

dataSource
    .GroupBy(item => new { item.FieldA, item.FieldB })
    .Select(group => new
    {
        First = group.Key.FieldA,
        Second = group.Key.FieldB,
        Third = group.GroupBy(q => q.Id).Select(q => q.Select(e => e.FieldC).ToArray()).ToArray()
    }).ToArray();

只有几张小纸条
.GroupBy
用于获取
分组
s,因此当不需要不同的执行时,可以通过将
.GroupBy(
替换为
.ToLookup(
来避免一些开销

每个
分组
中的元素都是,因此我看不出将它们转换为
.ToList
(但是如果将它们转换为
.ToArray
,可以节省一点空间)

DataTable.AsEnumerable
使用,但当有任何通常不需要的
DataView
排序或筛选时,它似乎还做了一些额外的工作

var groups = datatable.Rows.Cast<DataRow>()
    .ToLookup(r => Tuple.Create(
        r["FieldA"] as long?,
        r["FieldB"]?.ToString()
    ))
    .Select(g => Tuple.Create(
        g.Key.Item1, 
        g.Key.Item2,
        g.ToLookup(r => r["ID"] as long?, r => r["FieldC"] as long?)
    )).ToList();
var groups=datatable.Rows.Cast()
.ToLookup(r=>Tuple.Create(
r[“FieldA”]长多少?,
r[“FieldB”]?.ToString()
))
.Select(g=>Tuple.Create(
g、 关键项目1,
g、 关键项目2,
g、 托卢库普(r=>r[“ID”]作为长?,r=>r[“FieldC”]作为长?)
)).ToList();

和往常一样,但我认为这些信息可能有用。

你的LINQ查询有什么错误?我没有收到任何错误,但我无法对第三个字段进行分组。字段A和字段B可以,但第三个字段必须是列表列表,我不能这样做。你能展示一下你是如何对第三个字段进行分组的吗?我不是OP,只是好奇而已h关注整体
GroupBy
grouping@ColinMThenBy是什么意思?它适用于有序序列,就像一个符咒:)谢谢@Sergey Berezovskiy我的意思是像
datatable.AsEnumerable().GroupBy().ThenBy()这样的语法
,但在进一步检查时,由于第二个分组是针对集合中的项目,因此无法像上面那样工作。