c# - linq在特定条件下获取多个值

标签 c# linq lambda

我正在使用此查询根据特定条件获取特定值中的值..

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/

相关文章:

c# - 使用 msmq 队列对服务进行负载平衡?

c# - 使用 DataTable.Load() 而不创建所有列属性

linq - 比较两个集合

c# - 如何使我的多对多查询更快?

python - python 中的内联错误/异常处理

java - 为什么 Java 编译器不能从约束 Iterable< 中推断出 Iterable<String>?扩展 CharSequence> 和 () -> (Iterator<String>)

c# - 服务契约中层次结构中的通用接口(interface)

c# - Mvvm 模型 View 模型

c# - 输入字符串的格式不正确

java - 是否收集了 lambda 垃圾?