如何在DataView上使用行过滤器

时间:2015-08-21 12:07:21

标签: c# ado.net

我有数据表,该表有一个名为joiningDate的列,格式为mm-dd-yyyy。我想根据当前月份过滤该表,因此我使用DataView进行此类操作,我的代码是:

DateTime now = DateTime.Now;
DataView dvUpcomingLeave = new DataView(dtLeaves);
dvUpcomingLeave.RowFilter = "DATEPART(Month, joiningDate) = " + now.Month;

但它向我显示错误:

  

表达式包含未定义的函数调用DATEPART()。

我认为因为DATEPART()不是ADO.NET的功能,所以任何人都可以帮助我如何使用DataView RowFilter来解决这个问题。

2 个答案:

答案 0 :(得分:0)

您无法使用RowFilter表达式提供的功能(与DataColumn的Expression属性相同)

但是你可以用这样的东西达到你的目标

DataView v = dtLeaves.AsEnumerable()
            .Where(x => x.Field<DateTime>("joiningDate")
                  .Month == DateTime.Today.Month)
            .CopyToDataTable().DefaultView;

警告,如果Where返回的输入IEnumerable为空,则此CopyToDataTable将失败,因此最好将其拆分为多行,并在进行下一行之前测试结果步骤

var temp = dtLeaves.AsEnumerable()
            .Where(x => x.Field<DateTime>("joiningDate")
            .Month == DateTime.Today.Month);
if(temp.Any())
    DataView dvUpcomingLeave = temp.CopyToDataTable().DefaultView;

答案 1 :(得分:0)

您必须将日期值放在引号或主题标签中(Source: csharp-examples.net

所以,在你的情况下:

  @Override
  public void execute(final Tuple _tuple) {
           insertQueue.add(_tuple);

  }

dvUpcomingLeave.RowFilter = String.Format("DATEPART(Month, joiningDate) = '{0}'",now.Month);