我想这应该很简单,但是我找不到如何做.
我有一个linq查询,它选择int类型的一列,我需要对其进行排序.
var values = (from p in context.Products
where p.LockedSince == null
select Convert.ToInt32(p.SearchColumn3)).Distinct();
values = values.OrderBy(x => x);
SearchColumn3是op类型的字符串,但我只包含整数.所以我认为,转换为Int32并进行排序肯定会给我一个漂亮的1,2,3排序值列表.但是相反,列表像字符串一样保持有序.
199 20 201
更新:
我已经使用C#代码和LinqPad进行了一些测试.
LinqPad生成以下SQL:
SELECT [t2].[value]
FROM (
SELECT DISTINCT [t1].[value]
FROM (
SELECT CONVERT(Int,[t0].[SearchColumn3]) AS [value], [t0].[LockedSince], [t0].[SearchColumn3]
FROM [Product] AS [t0]
) AS [t1]
WHERE ([t1].[LockedSince] IS NULL)
) AS [t2]
ORDER BY [t2].[value]
我的SQL事件探查器说我的C#代码生成了这段SQL:
SELECT DISTINCT a.[SearchColumn3] AS COL1
FROM [Product] a
WHERE a.[LockedSince] IS NULL
ORDER BY a.[SearchColumn3]
因此,看起来C#Linq代码只是省略了Convert.ToInt32.
有人可以说些有用的东西吗?
解决方法:
[免责声明-我在Telerik工作]
您也可以使用Telerik OpenAccess ORM解决此问题.这是我在这种情况下的建议.
var values = (from p in context.Products
where p.LockedSince == null
orderby "cast({0} as integer)".SQL<int>(p.SearchColumn3)
select "cast({0} as integer)".SQL<int>(p.SearchColumn3)).ToList().Distinct();
OpenAccess提供了SQL扩展方法,使您能够向生成的sql语句中添加一些特定的sql代码.
我们已经开始着手改善这种行为.
感谢您指出这一点.
问候
拉尔夫