在where子句中使用字符串值进行过滤

时间:2019-03-05 14:42:29

标签: c# asp.net devexpress

我有一个DataSet,其中包含以下项目:

X0101
X0202
X0303
...

在页面加载时,我检索了所有这些内容,并且需要根据已选择的组合框值对其进行过滤,为此我要做:

protected void cmbUniqueID_Callback(object sender, DevExpress.Web.CallbackEventArgsBase e)
{
    string selectedID = e.Parameter;
    DataSet dataSet = GetAllUniqueIDs();

    var fullList = dataSet?.Tables[0]
        .AsEnumerable()
        .Select(x => new
         {
            UniqueID = x.Field<string>("UniqueID")
         });

   var filteredList = from r in fullList where r.UniqueID >= selectedID select r;

   cmbUniqueID.DataSource = filteredList;
   cmbUniqueID.DataBind();

}

但是出现以下错误:

  

错误CS0019运算符'> ='不能应用于类型为'string'和'string'的操作数

例如,如果用户选择X0101,则只有X0202 & X0303保留在过滤列表中。

有人可以告诉我如何过滤数据。

2 个答案:

答案 0 :(得分:1)

由于您的ID不是数字,因此您无法进行数学比较。

如果您的ID的长度和格式始终相同(字母+ 4个数字),则只需解析数字部分即可。

您可以使用正则表达式,但是一种快速的方法是:

UniqueID = int.Parse(x.Field<string>("UniqueID").Substring(1))

这将为您提供数字部分。您稍后必须重新添加X。或者,您可以在匿名类型中为数字部分添加一个单独的字段。

或者,如果不更改.Where,也可以将源更改为数值形式以进行数学运算,而不是。

您可以

where int.Parse(r.UniqueID.Substring(1)) >= int.Parse(selectedID.Substring(1))

它将比较数字部分。

或者,如果您希望使用不同的逻辑或ID更改格式,则可以编写自己的方法来比较两者。

根据问题的最后一部分,您可能希望使用=而不是>=,因为后者将包括您选择的选项。

答案 1 :(得分:-1)

我已经检查了代码,只需要做的就是更改where子句运算符。

private void FilterData()
    {
        string selectedID = "X0101";
        DataSet dataSet = GetAllUniqueIDs();

        var fullList = dataSet?.Tables[0]
            .AsEnumerable()
            .Select(x => new
            {
                UniqueID = x.Field<string>("UniqueID")
            });

        var filteredList = from r in fullList where Convert.ToInt64(r.UniqueID.Substring(1)) > Convert.ToInt64(selectedID.Substring(1)) select r;
    }

    private DataSet GetAllUniqueIDs()
    {
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        dt.Columns.Add("UniqueID");

        DataRow dr = dt.NewRow();
        dr["UniqueID"] = "X0101";
        dt.Rows.Add(dr);

        dr = dt.NewRow();
        dr["UniqueID"] = "X0202";
        dt.Rows.Add(dr);

        dr = dt.NewRow();
        dr["UniqueID"] = "X0303";
        dt.Rows.Add(dr);

        dt.AcceptChanges();
        ds.Tables.Add(dt);

        return ds;
    }