【问题标题】:Compare DataTable Column Value with Enum in Row Filter C#将 DataTable 列值与行过滤器 C# 中的枚举进行比较
【发布时间】:2017-08-07 08:05:24
【问题描述】:

我有一个要使用 DataView 过滤的数据表。过滤条件基于枚举值和字符串数据表列值。以下是我正在尝试做的事情

DataView dv = data.DefaultView;
dv.RowFilter = "Status =" + Enum.Valid;

由于状态列是字符串,行过滤器不起作用。我尝试将“状态”列作为“枚举”,但它仍然不起作用。

请提出建议。

谢谢

【问题讨论】:

  • Enum.Valid.ToString ()

标签: c# enums dataview rowfilter


【解决方案1】:

来自 DataView.Filter 文档:“有关详细信息,请参阅 DataColumn 类的 Expression 属性”

来自DataColumn.Expression Documentation

对于包含枚举值的列,将值转换为整数数据类型。例如: "枚举列 = 5"

【讨论】:

  • OP写数据表的列类型是字符串
【解决方案2】:

如果Status列中的字符串值是枚举成员的标识符名称,则可以进行字符串比较:

var dv = data.DefaultView;
var enumValueAsString = Enum.Valid.ToString();
dv.RowFilter = $"Status = '{enumValueAsString}'";

Documentation:

为过滤器创建表达式时,用单引号将字符串括起来

另一方面,如果Status 列中的值属于Enum 类型,则需要进行数值比较:

var dv = data.DefaultView;
var enumValueAsInt = (int)Enum.Valid;
dv.RowFilter = $"Status = {enumValueAsInt}";

【讨论】:

  • 这给了我一个例外,“=”运算符不能在字符串和枚举类型之间使用
  • 在这种情况下,我怀疑“状态列是字符串”(System.String) 的断言是否正确。
  • 现在我将“状态”列更改为“枚举”类型。
【解决方案3】:

所以它在不使用 DataView 的情况下对我有用

 var result = dataTable.AsEnumerable()
            .Where(x => x.Field<IfmEqcStatus>("Status") == Enum.Valid);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2014-09-13
    相关资源
    最近更新 更多