我有以下LINQ查询: -
(from a in MyData
where a.Field1.Replace(" ","").Contains("ABCDEFG")
select a.Field2).Take(50)
它返回: -
114
115
115 A
116
116 A
118
119
122
124
128
131
132
133
95
96
97
98
99
我需要能够以数字方式对此列表进行排序,我可以这样做: -
(from a in MyData
where a.Field1.Replace(" ","").Contains("ABCDEFG")
select a.Field2).Take(50).OrderBy(x => Convert.ToInt32(x))
问题在于: -
Conversion failed when converting the nvarchar value '111 A ' to data type int.
因为它显然无法将'111 A '
转换为整数。
有没有办法只为排序剥离所有非数字字符?
答案 0 :(得分:3)
尝试:
MyData.Where(d => Field1.Replace(" ","").Contains("ABCDEFG"))
.AsEnumerable()
.OrderBy(d => Convert.ToInt32(Regex.Split(d.Field2, @"\D+")[0]))
.Take(50)
.Select(d => d.Field2);
您可以根据所需的结果交换OrderBy()和Take()。但正如鲍勃·韦尔在下面提到的那样:
如果Take()是第一个,那么它应该在AsEnumerable()
之前
这样您就不会加载来自源的所有记录。
答案 1 :(得分:0)
不是那里最漂亮的代码,但是在你的sort lambda中,你可以创建一个仅由数字组成的新字符串,然后将其转换为排序值的整数。
.OrderBy(x =>
Convert.ToInt32(new string(x.Where(c => char.IsDigit(c))
.ToArray()
)
)
);