我是C#linq的新手。
我的数据结果如下,
Id | Name | Code
1 | Go | GOS
1 | RES | RECSO
1 | ICS | ICSO
2 | Go | GOS
2 | ICS | ICSO
我希望结果如下,
Id | Name | Code
1, Go,RES,ICS | GOS,RECSO,ICSO
2, Go,ICS | GOS,ICSO
有些人可以通过优化的方式为此提供linq查询,因为我有大数据集。
提前致谢
答案 0 :(得分:3)
您需要按Id
对数据进行分组,然后使用string.Join
获取Name
和Code
的逗号分隔值
var query = from m in Data
group m by m.Id into grp
select new {ID = grp.Key
,Name= string.Join(",",grp.Select(g=>g.Name ))
,Code= string.Join(",",grp.Select(g=>g.Code )) };
如果您的数据源是EF或LinqtoSQL或任何其他ORM,则使用Data.AsEnumerable()
强制在内存中进行分组和字符串连接
否则它将给出错误(在EF的情况下)或它将为每一行生成SQL查询(LinqToSQL)
答案 1 :(得分:2)
var result = data.GroupBy(g => g.Id)
.Select(s => new {
Id = s.Key,
Name = string.Join(",", s.Select(ss => ss.Name)),
Code = string.Join(",", s.Select(ss => ss.Code)),
});
答案 2 :(得分:0)
这个怎么样:
LINQ部分:
List<BeforeData> listBefore = new List<BeforeData>();
Dictionary<int, List<AfterData>> listAfter = listBefore
.GroupBy(it => it.ID)
.ToDictionary(x => x.Key, y => y.Select(z => new AfterData(z.name, z.code)).ToList());
假设课程:
public class BeforeData
{
public int ID;
public string name, code;
public BeforeData(int ID, string name, string code)
{
this.ID = ID;
this.name = name;
this.code = code;
}
}
public class AfterData
{
public string name, code;
public AfterData(string name, string code)
{
this.name = name;
this.code = code;
}
}
修改:简化的LINQ