我正在使用此查询根据特定条件获取特定值中的值..
for (int i = 0; i < 50; i++)
{
DataRow dr = gridviewdt.NewRow();
dr[0] = dt.AsEnumerable()
.Where(l => l.Field<int?>("ID") == items[i].curing_id)
.Select(l => l.Field<string>("description"))
.First()
.ToString();
dr[1] = (from row in dt.AsEnumerable()
where row.Field<int?>("ID") == items[i].curing_id
select row).Count();
dr[2] = (from row in dt.AsEnumerable()
where row.Field<int?>("ID") == items[i].curing_id && row.Field<int?>("status") == 1
select row).Count();
dr[3] = (from row in dt.AsEnumerable()
where row.Field<int?>("ID") == items[i].curing_id && row.Field<int?>("status") == 2
select row).Count();
dr[4] = (from row in dt.AsEnumerable()
where row.Field<int?>("ID") == items[i].curing_id && row.Field<int?>("status") == 3
select row).Count();
griddt.Rows.Add(dr);
}
上述这些语句需要更多时间在循环中多次执行查询,而且数据表 dt
包含数十万条记录。我希望它是这样的
for (int i = 0; i < num_of_curing; i++)
{
DataRow dr = gridviewdt.NewRow();
dr[0] = dt.AsEnumerable()
.Where(l => l.Field<int?>("ID") == items[i].curing_id)
.Select(l => l.Field<string>("description"))
.First()
.ToString();
data = dt.AsEnumerable().Where(l => l.Field<int?>("ID") == items[i].curing_id)
.Select(g => new
{
dr[1] = g.Count(),
dr[2] = (g.Field<int?>("status") == 1).Count(),
dr[3] = (g.Field<int?>("status") == 2).Count(),
dr[4] = (g.Field<int?>("status") == 3).Count()
});
gridviewdt.Rows.Add(dr);
}
是否可以按上述方式或任何其他最佳方式编写?
最佳答案
它很慢,因为您要进行多个查询,而您可以进行一个查询。
这段代码只会进行一次查询并将结果存储在一个数组中。然后,您可以安全地使用这些数据。
此外,如果 i
被限制为 items
的数量,则不需要 for
循环:
foreach (var item in items)
{
DataRow dr = griddt.NewRow();
var data = dt
.AsEnumerable()
.Where(l => l.Field<int?>("ID") == item.curing_id)
.Select(l => new {
description = l.Field<string>("description"),
status = l.Field<int?>("status")
})
.ToArray();
dr[0] = data[0].description;
dr[1] = data.Count();
dr[2] = data.Count(d => d.Status == 1);
dr[3] = data.Count(d => d.Status == 2);
dr[4] = data.Count(d => d.Status == 3);
griddt.Rows.Add(dr);
}
关于c# - linq在特定条件下获取多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34170366/