我有一个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
保留在过滤列表中。
有人可以告诉我如何过滤数据。
答案 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;
}