[英]linq get multiple values at certain conditions
我正在使用此查詢在某些條件的基礎上獲取某些值的值。
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);
}
是否可以以上述方式或任何其他最佳方式書寫?
它很慢,因為你正在做幾個查詢,而你可以做一個。
此代碼僅生成一個查詢並將結果存儲在數組中。 然后,您可以安全地使用此數據。
此外,你不需要for
循環,如果i
被限制的數items
:
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);
}
您可以使用這樣的匿名對象:
var data = (from row in dt.AsEnumerable()
where row.Field<int?>("ID") == items[i].curing_id
select new
{
dr1 = row.Count(),
dr2 = (row.Field<int?>("status") == 1).Count(),
dr3 = (row.Field<int?>("status") == 2).Count(),
dr4 = (row.Field<int?>("status") == 3).Count(),
}).FirstOrDefault();
並像這樣填充你的datarow
dr[1] = data.dr1;
dr[2] = data.dr2;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.