DataTable作为IEnumberable来提高C#的性能

时间:2017-01-11 12:48:43

标签: c# sql .net linq

在我们的应用程序中,提高过滤DataTable中行的性能。我们修改了下面的代码以获得IEnumerable。

DataRow[] drow = ds.Tables[0].Select("ID ='" + id + "'");

DataRow[] drow =
                        (
                        from item in ds.Tables[0].AsEnumerable()
                        where item["ID"].ToString() == id
                        select item
                        ).ToArray();

成功并且运作良好。 注意:ds是一个数据集对象。

我们还有另一种方案可以根据

等条件过滤行
DataRow[] maxBalRow = ds.Tables[0].Select("BALANCE = MAX(BALANCE)");

这里我们无法解决,因为条件包含“MAX”DB功能。

请提供解决方案/建议以解决此问题。

谢谢, 斯

3 个答案:

答案 0 :(得分:2)

您可以将DataTable转换为数组(Tim Schmelter对评论的建议):

DataRow[] drow = ds.Tables[0].Select();

之后,您可以执行查询,样本:

DataRow item = drow.FirstOrDefault(row => row["ID"] == id);

// get the max balance first
double maxBalance = drow.Max(row => (double)row["BALANCE"]);

// search for items with the max balance
DataRow[] item = drow.Where(row => row["BALANCE"] == maxBalance).ToArray();

答案 1 :(得分:0)

另一种解决方案可以是按照asc顺序对表进行排序 字段'BALANCE'并选择最后一行.g

   DataRow[] myrows= ds.Tables[0].Select("","BALANCE ASC");
   DataRow rowtoget=myrows[myrows.Length-1];

希望它有所帮助。

答案 2 :(得分:0)

我认为要查找ID,您应该使用table.Rows.Find()方法,这比表扫描更快。

ds.Tables[0].Rows.Find(id);

搜索MAX(BALANCE) (以及所有匹配的行),您必须执行表格扫描。您可以在一次扫描中将它们组合起来,而不是进行两次扫描(确定最大值并比较它们)

// list of balances.
var maxBalances = new List<DataRow>();

// initial value
double maxBalance = 0;

// check each row
foreach(var row in ds.Tables[0])
{
    // read the value
    var value = (double)row["BALANCE"];

    // if the value is higher than the previous balance, forget all previous selected rows.
    if(value > maxBalance)
    {
        // set the new maxBalance value.
        maxBalance = value;

        // clear the list
        maxBalances.Clear();
    }

    // if the value == maxBalance, add it to the list.
    if(value == maxBalance)
        maxBalances.Add(row);
}

// maxBalances contains all rows who share the highest balance.