在我们的应用程序中,提高过滤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功能。
请提供解决方案/建议以解决此问题。
谢谢, 斯
答案 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.