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

Filtering using a string value in where clause

我有一个 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();

}

但是我得到以下错误:

Error CS0019 Operator '>=' cannot be applied to operands of type 'string' and 'string'

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

谁能告诉我如何过滤数据。

由于您的 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 更改格式,您可以编写自己的方法来比较两者。

根据你问题的最后一部分,你可能想要 = 而不是 >=,因为后者将包含你选择的选项。

我已经检查了代码,您唯一需要做的就是更改 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;
    }