从 DataRow [] 集合中选择一个 DataRow

9

我的代码:

DataRow[] row = ByTotalTemplate.Select("TEMPLATE_ID=" + DisTemplateID);

一行包含TEMPLATE_IDMIN_AMOUNTMAX_AMOUNTDISCOUNT

现在我想选择一行,在这一行中给定的金额介于MIN_AMOUNTMAX_AMOUNT之间

我尝试过这样做:

DataRow amountRow = row.Select("MIN_AMOUNT<" + quantity + " AND MAX_AMOUNT>" + quantity);

但这并没有起作用。


你是遇到了错误还是无法获取所需的行? - whastupduck
你的变量是否也被拼错成了qunatity而不是quantity?也许这就是问题所在!:D - Ms. Nobody
3个回答

13

我会使用Linq而不是纠结于表达式语法:

IEnumerable<DataRow> rows = ByTotalTemplate.AsEnumerable()
           .Where(r => r.Field<int>("TEMPLATE_ID") == DisTemplateID
                    && r.Field<int>("MIN_AMOUNT") < quantity
                    && r.Field<int>("MAX_AMOUNT") > quantity);

如果你想要一个包含筛选结果的新DataTable:

DataTable table = rows.CopyToDataTable();

请注意,CopyToDataTable 如果没有行,则会引发异常,因为它必须从行中派生列。所以你需要在使用之前先进行检查。你可以使用以下代码:

DataTable table = ByTotalTemplate.Clone();
if(rows.Any())
    table = rows.CopyToDataTable();
如果您想要一个数组:
DataRow[] rowArray = rows.ToArray();

如果你只想要第一行:

DataRow row = rows.FirstOrDefault(); // can be null if there is no matching row

顺便提一下,你的问题在于你在一个 DataRow[] 上使用了 DataTable.Select


如果“rows”不包含任何条目,则CopyToDataTable()将引发异常,请在使用该方法之前检查rows.any()以确保它有需要复制的内容。 - Enrico
@Enrico:我已经编辑了我的答案,展示了如何避免异常。 - Tim Schmelter
dataTable.AsEnumerable() 是我需要的,谢谢。 - Brian Birtle

4

如果你想使用 Select() 方法,你需要再次从你的 DataTable 中选择行。

DataRow[] rowsBetween = ByTotalTemplate.Select("TEMPLATE_ID = " + DisTemplateID + " AND MIN_AMOUNT < " + qunatity + " AND MAX_AMOUNT > " + qunatity);

2

请尝试这个

        DataRow[] row = ByTotalTemplate.Select("TEMPLATE_ID=" + DisTemplateID);
        //
        //some use of **row** here 
        //than after select record from **row**
        DataRow[] amountRow = row.CopyToDataTable().Select("MIN_AMOUNT < " + qunatity + " AND MAX_AMOUNT > " + qunatity);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接