由于我是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”的结果。如何实现这一目标? 我尝试了很多对我不起作用的解决方案。另外,有没有办法将结果作为数据流?如果您知道任何资源,如您推荐的网站,书籍等,请告诉我。
答案 0 :(得分:1)
怎么样
DataRow dr = dt.AsEnumerable()
.Where(x => Convert.ToInt32(x("ID")) == 3 &&
Convert.ToInt32(x("ParentID")) == 1)
.FirstOrDefault();
答案 1 :(得分:0)
通过你所说的你需要获得所有具有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");
答案 2 :(得分:0)
试试这个:
var rows = dt.AsEnumerable()
.Where(x => (int)x["ParentID"] == 1)
.GroupBy(x => x["FileName"]).Where(x=>x.Count() > 1)
.Select(x => x.Key);
如果您想忽略大小写,请尝试将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);