c#-用一列对Linq列表进行排序

我想这应该很简单,但是我找不到如何做.
我有一个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代码.
我们已经开始着手改善这种行为.
感谢您指出这一点.

问候

拉尔夫

上一篇:C#-在结构内部对列表进行排序


下一篇:如何基于C#中的Datetime键获取列表的子集?