【问题标题】:Filtering using a string value in where clause在 where 子句中使用字符串值进行过滤
【发布时间】:2019-03-05 14:42:29
【问题描述】:

我有一个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 &amp; X0303

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

【问题讨论】:

  • selectedID 是一个字符串。 &gt;= 操作符应该对字符串做什么?
  • X0101 等是唯一 ID 吗?因为你怎么知道X0101 是否大于X1234
  • @NibblyPig 是的,它们是唯一的 ID

标签: c# asp.net devexpress


【解决方案1】:

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

如果您的 ID 始终具有相同的长度和格式(字母 + 4 个数字),那么您只需解析出数字部分。

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

UniqueID = int.Parse(x.Field&lt;string&gt;("UniqueID").Substring(1))

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

或者,与其将源更改为数字以允许数学运算,不如更改.Where

你可以这样做

where int.Parse(r.UniqueID.Substring(1)) &gt;= int.Parse(selectedID.Substring(1))

比较数字部分。

如果您需要不同的逻辑,或者您的 ID 更改格式,您也可以编写自己的方法来比较两者。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • != 不会产生预期的行为
    猜你喜欢
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2013-09-09
    • 2012-03-28
    相关资源
    最近更新 更多