【问题标题】:C# DataTable.Select With multiple conditions on a Single ColumnC# DataTable.Select 在单个列上具有多个条件
【发布时间】:2017-03-20 04:14:24
【问题描述】:

我有一个 DataTable,我想一次查询一列以检查它是否符合设置的条件,由于某种原因,下面的代码在结果不正确之后为第一列提供了正确的结果。

private bool BusinessRulesOne(DataTable dt, DataColumn dc)
{
    bool isSatisfied = false;
    DataRow[] checkColumn = dt.Select(dc.ColumnName + " " + "in (1,2,3,)");

    if (checkColumn.Length != 0)
    {
        isSatisfied = true;
    }
    return isSatisfied;
}

在这个方法上,我传递了我正在查询的 DataTable 和我目前正在关注的 DataColumn。这里需要发生的是我想检查此列上的值是否由值 1,2 和 3 组成。如果是,则返回 true。

private bool BusinessRulesTwo(DataTable dt, DataColumn dc)
{
    bool isSatisfied = false;
    var checkColumn = dt.Select(dc.ColumnName + " " + " = 1");

    if (checkColumn.Count() > 3)
    {
        isSatisfied = true;
    }
    return isSatisfied;
}

在另一条规则中,我正在检查该列中一个 (1) 的数量是否超过三 (3),如果是,则返回 true。

欢迎提出任何建议,我不了解 Linq,但如果它能让生活更轻松,我愿意学习和探索它。

用一列中的值进行编辑

【问题讨论】:

  • 请更好地解释您在使用此代码时遇到的问题。它会产生不正确的输出吗?您想将两种方法合二为一吗?你想用 Linq 重写方法吗?我在帖子中没有看到问号。
  • 抱歉不清楚。上面的代码产生不正确的输出,它假设查询 DataTable 中的 DataColumn。在第一条规则中,如果 DataColumn 由数字 1,2 和 3 组成,它假设返回 true。它对第一列正确执行此操作。在第二列上,它返回 false 而不是 true。因此,我正在寻找建议,如果 Linq 中有一种方法也可以。

标签: c# .net linq datatable datacolumn


【解决方案1】:

首先你应该知道数据表没有实现 IEnumerable 所以在这里使用 Linq 你应该使用 AsEnumerable: 对于第一条规则:

private bool BusinessRulesOne(DataTable dt, DataColumn dc)   { return dt.AsEnumerable().Any(dataRow => !String.IsNullOrEmpty(dataRow.Field<string>(dc.ColumnName).First().ToString()) && ( dataRow.Field<int>(dc.ColumnName)  == 1  || dataRow.Field<int>(dc.ColumnName)  == 2 || dataRow.Field<int>(dc.ColumnName)  == 3));}

第二条规则:

private bool BusinessRulesTwo(DataTable dt, DataColumn dc) { return  dt.AsEnumerable().Where(dataRow => !String.IsNullOrEmpty(dataRow.Field<string>(dc.ColumnName).First().ToString()) && ( dataRow.Field<int>(dc.ColumnName) == 1)).Count() > 3 ;}

【讨论】:

  • 它给出了'DataTableExtensions.AsEnumerable(DataTable)' is a method, which is not valid in the given context 错误。有没有我不知道的参考资料需要补充。我有System.LinqSystem.Data
  • 试过它的编译,但在查询它时说Specified cast is not valid.dataRow.Field&lt;int&gt;(dc.ColumnName) == 1
  • @Lord-David 您的列中是否存在非数字值的行?
  • 不,它们都是数字,有些是空的。我认为这就是问题所在。
  • 是的,我有,Field 要求我们投射它。 &lt;int&gt; 不会在空白字段中工作。
【解决方案2】:

"如果该列的值由值 1,2 和 3 组成,则返回 true"

BusinessRulesOne 没有正确表达这种情况。它的工作方式不同:“如果列至少包含一个集合中的值,则返回 true”。它不保证没有其他值。

这里是逆向逻辑的修改方法:“如果该列包含除1,2或3之外的smth,则返回false”

private bool BusinessRulesOne(DataTable dt, DataColumn dc)
{
    DataRow[] checkColumn = dt.Select(dc.ColumnName + " not in (1,2,3)");

    return checkColumn.Length == 0;
}

【讨论】:

  • 我检查了它解决了BusinessRulesOne 方法,它似乎返回了正确的数据。对第二个有任何想法吗?
  • @Lord-David,表达式看起来正确,应该可以。你能举一个产生错误结果的 DataTable 值的例子吗?
  • 查看问题编辑,这是一个包含数据的列。我是说如果 1 大于 3 则返回 true。但正如您在该列上看到的那样,1 并没有超过 3。
  • @Lord-David,在if (checkColumn.Count() &gt; 3) 行设置一个断点,当它命中时,检查哪些行在checkColumn 数组中。
  • 我做到了,第一列的 True 之后,它的 False 不应该是这种情况。
猜你喜欢
  • 2017-08-10
  • 1970-01-01
  • 2023-04-10
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 2014-09-08
相关资源
最近更新 更多