在 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;
}
我有一个 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;
}