linq 取部分重复项的问题

gujianfei1979 2016-12-22 11:43:15
Id为自增长值,永远不会重复,而且后续的代码中需要用到Id值。
学习了下述代码,利用group by分组取count值得到Code 和Name均重复的行。
可是这里无法得到 Id。

DataTable dt = this.JsonToDataTable("["
+ "{\"Id\":\"1\",\"Code\":\"SortId\",\"Name\":\"SortId\"},"
+ "{\"Id\":\"2\",\"Code\":\"SortCode\",\"Name\":\"编号\"},"
+ "{\"Id\":\"3\",\"Code\":\"SolutionName\",\"Name\":\"名称\"},"
+ "{\"Id\":\"4\",\"Code\":\"SortId\",\"Name\":\"SortId\"},"
+ "{\"Id\":\"5\",\"Code\":\"SortId\",\"Name\":\"SortId\"},"
+ "{\"Id\":\"6\",\"Code\":\"SortId001\",\"Name\":\"SortId\"}]");
DataTable dtSort = dt.Clone();
int i = 0;
var query = from t in dt.AsEnumerable()
group t by new { t1 = t.Field<string>("Code"), t2 = t.Field<string>("Name") } into m
select new
{
code = m.Key.t1,
name = m.Key.t2,
rowcount = m.Count()
};
foreach (var q in query)
{
//q.rowcount可以获取到一共有几条重复数据,比如在该例子中q.rowcount就是3
if (q.rowcount > 1)
{
//有重复
}
}
=======================================================================
由于第一天接触linq ,只好自己瞎蒙。
最终发现代码小做改变可以得到Id:
select new
{
id = m, //====》改变处
code = m.Key.t1,
name = m.Key.t2,
rowcount = m.Count()
};

foreach (var q in query)
{
//q.rowcount可以获取到一共有几条重复数据,比如在该例子中q.rowcount就是3
if (q.rowcount > 1)
{
//有重复
q.id.ElementAt(0)["Id"]
q.id.ElementAt(1)["Id"]
q.id.ElementAt(2)["Id"] //==========>得到Id处
}
}
=================================================================
这个方法显然很小学生,有哪位大神有更好的方法???
...全文
120 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
john_QQ:2335298917 2016-12-22
  • 打赏
  • 举报
回复
引用 3 楼 Chinajiyong 的回复:
select new { id = m.Select(t=>t.Id), //====》改变处 code = m.Key.t1, name = m.Key.t2, rowcount = m.Count() };
正解
EnForGrass 2016-12-22
  • 打赏
  • 举报
回复

  var query = from t in dt.AsEnumerable()
                        group t by new { t1 = t.Field<string>("Code"), t2 = t.Field<string>("Name") } into m
select new
                        {
                            id = m.Select(t=>t.Id),                                                //====》改变处
                            code = m.Key.t1,
                            name = m.Key.t2,
                            rowcount = m.Count()
                        };

var query = query .Where(o=> o.rowcount > 1)
闭包客 2016-12-22
  • 打赏
  • 举报
回复
…… group by code, name 之后,每一个 group by 结果集本来就是没有 id 的啊。
EnForGrass 2016-12-22
  • 打赏
  • 举报
回复
select new { id = m.Select(t=>t.Id), //====》改变处 code = m.Key.t1, name = m.Key.t2, rowcount = m.Count() };
gujianfei1979 2016-12-22
  • 打赏
  • 举报
回复
这个我知道,可select m不是重点啊,我最后取Id的方法其实就是从m的参数中取的。 我想知道有没有其他更方便的取重复项 Id 的方法。
  • 打赏
  • 举报
回复
你select m出来就可以了,m可以取到你所有的信息,根本没必要new一个临时类出来

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧