c# - 在 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
保留在过滤列表中。
有人可以告诉我如何过滤数据。
解决方案
由于您的 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 更改格式,您可以编写自己的方法来比较两者。
根据您问题的最后一部分,您可能想要=
而不是>=
,因为后者将包含您选择的选项。
推荐阅读
- apache-camel - REST API Camel 的拦截器
- javascript - 字符串替换,但仅适用于引号内的子字符串
- next.js - NextJS 和反应查询
- powershell - 仅在找到另一个字符串时才查找字符串的实例
- elasticsearch - 对特定字段进行查询的 Elasticsearch 批量更新
- asp.net - 连接到 ElasticSearch .net
- docker - 在 terraform 中读取文件并将其传递给 docker 容器时保留文件内容的缩进
- python - TypeError:不可散列的类型:字典中的“列表”
- python - Atom中的超链接不可点击?
- python - Django将本地时间转换为UTC时间