我有一个LINQ查询,它在多个字段中搜索字符串(使用正则表达式)。我想根据找到文本的字段对结果进行排序。
目前我有这个:
var results = from i in passwordData.Tables["PasswordValue"].AsEnumerable()
where r.IsMatch(i.Field<String>("Key").Replace(" ","")) ||
r.IsMatch(i.Field<String>("Username").Replace(" ","")) ||
r.IsMatch(i.Field<String>("Other").Replace(" ",""))
orderby i.Field<String>("Key"),
i.Field<String>("Other"),
i.Field<String>("Username")
select i;
我希望在Key中找到匹配项,然后在Other中找到匹配项,然后在Username中找到匹配项。如果可能,匹配Key和Other的匹配应该在匹配Key之前匹配。
我目前根据Key首先对代码进行排序,因此如果在“其他”上找到匹配但按键以A开头,则会在Key上找到匹配之前对其进行排序,其中Key以Z开头。
在此先感谢,我认为这不是一个难题,但由于我是LINQ的新手,我无法弄清楚如何做到这一点。
答案 0 :(得分:7)
使用let
关键字捕获中间值,您可以在排序匹配值之前轻松排序是否匹配:
var results = from i in passwordData.Tables["PasswordValue"].AsEnumerable()
let fields = new {
Key = i.Field<String>("Key"),
Username = i.Field<String>("Username"),
Other = i.Field<String>("Other") }
let matches = new {
Key = r.IsMatch(fields.Key.Replace(" ","")),
Username = r.IsMatch(fields.Username.Replace(" ","")),
Other = r.IsMatch(fields.Other.Replace(" ","")) }
where matches.Key || matches.Username || matches.Other
orderby matches.Key descending, fields.Key,
matches.Username descending, fields.Username,
matches.Other descending, fields.Other
select i;
答案 1 :(得分:0)
您的一个解决方案是创建2个方法,一个用于密钥搜索,另一个用于其他搜索。然后根据搜索到的字段,您按顺序运行。虽然这可能是额外的编码,但是我认为这样做的唯一方法就是创建自己的表达树,而这些树更难实现。
答案 2 :(得分:0)
这是一种简单但性能欠佳的方法:
static IEnumerable<DataRow> DoSearch(DataTable table, RegEx r, string fieldName) {
return table.AsEnumerble()
.Where(row => r.IsMatch(row.Field<string>(fieldName).Replace(" ", ""))
.OrderBy(row => row.Field<string>(fieldName));
}
var table = passwordData.Tables["PasswordValue"];
var results = DoSearch(table, r, "Key")
.Union(DoSearch(table, r, "Username")
.Union(DoSearch(table, r, "Other");
如果行匹配多个字段,Union
方法将过滤掉重复项。