数据表的Linq分组
本文关键字:分组 Linq 数据表 | 更新日期: 2023-09-27 18:25:22
因为我是LINQ的新手,正在为以下数据表编写组查询:
DataTable dt = new DataTable("Files");
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("ID", typeof(int)),
new DataColumn("FileName", typeof(string)),
new DataColumn("ParentID", typeof(int))
} );
dt.Rows.Add(1, "File1.Jpg", 1);
dt.Rows.Add(2, "File2.jpg", 1);
dt.Rows.Add(3, "File3.jpg", 1);
dt.Rows.Add(4, "File3.jpg", 1);
dt.Rows.Add(5, "File4.jpg", 1);
dt.Rows.Add(6, "File3.jpg", 2);
对于给定的parentID=1,我需要"file3.jpg"的结果。我怎样才能做到这一点?我尝试了很多对我不起作用的解决方案。还有,有没有办法把结果作为数据行?。如果你知道你推荐的网站、书籍等资源,请告诉我。
怎么样
DataRow dr = dt.AsEnumerable()
.Where(x => Convert.ToInt32(x("ID")) == 3 &&
Convert.ToInt32(x("ParentID")) == 1)
.FirstOrDefault();
根据您所说的,您需要获取parentID=1和FileName=file3.jpg的所有值。如果是这种情况,您可以使用DataView,根据您的示例,您有2条具有这些值的记录(id为3和4的记录),因此要使用DataView获取这些值,您可以执行以下操作:
DataView dv = new DataView(dt); //dt is your datatable.
dv.RowFilter = "ParentID = '1' AND FileName = 'File3.jpg'";
for (int i = 0; i < dv.Count; i++)
{
Console.WriteLine(dv[i]["ID"] + " - " + dv[i]["FileName"]);
}
编辑:
如果只是使用linq并获得第一个"File3.jpg"作为数据行:
DataRow dr = dt.AsEnumerable().FirstOrDefault(r => r["ParentID"].ToString() == "1" && r["FileName"].ToString() == "File3.jpg");
试试这个:
var rows = dt.AsEnumerable()
.Where(x => (int)x["ParentID"] == 1)
.GroupBy(x => x["FileName"]).Where(x=>x.Count() > 1)
.Select(x => x.Key);
更新
如果您想忽略case,请尝试将StringComparer.CurrentCultureIgnoreCase
作为第二个参数添加到GroupBy<...>
中,如下所示:
var rows = dt.AsEnumerable()
.Where(x => (int)x["ParentID"] == 1)
.GroupBy<DataRow,string>(x => x["FileName"].ToString(), StringComparer.CurrentCultureIgnoreCase)
.Where(x=>x.Count() > 1)
.Select(x => x.Key);