首页 > 解决方案 > 在 where 子句中使用字符串值进行过滤

问题描述

我有一个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 运算符“>=”不能应用于“字符串”和“字符串”类型的操作数

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

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

标签: c#asp.netdevexpress

解决方案


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

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


推荐阅读