3

我想这应该很简单,但我找不到怎么做。我有一个 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 类型的字符串,但 i 只包含整数。所以我想,转换为 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。任何人都可以对此说些有用的东西吗?

4

4 回答 4

3

[免责声明 - 我在 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 代码。我们已经开始努力改善这种行为。感谢您指出这一点。

问候

拉尔夫

于 2011-08-25T10:43:42.200 回答
2

与我的其他问题的答案相同,事实证明我正在使用的 Linq 提供程序,Telerik OpenAccess ORM 附带的提供程序与标准的 Linq to SQL 提供程序不同!请参阅我在开篇文章中发布的 SQL!我完全没想到会发生这样的事情,但我似乎 Telerik OpenAccess 的事情仍然需要很多改进。所以在开始使用它之前要小心。它看起来不错,但它有一些严重的缺点。

于 2011-08-21T09:27:25.397 回答
1

我无法复制这个问题。但只需确保在检查集合时枚举集合。你如何检查结果?

values = values.OrderBy(x => x);
foreach (var v in values)
{
    Console.WriteLine(v.ToString());
}

请记住,这不会更改数据库或其他任何地方的记录顺序 - 只会更改您可以从values枚举中检索它们的顺序。

于 2011-08-19T04:03:14.117 回答
-2

因为您的values变量是Linq表达式的结果,所以在您调用诸如 , 等方法之前,它并不真正具有ToListToArray

回到您的示例,方法中的变量xOrderBy被视为p.SearchColumn3字符串,因此它是一个字符串。

为避免这种情况,您需要在方法p.SearchColumn3之前让成为整数OrderBy。您应该let在代码中添加如下语句:

var values = (from p in context.Products
              where p.LockedSince == null
              let val = Convert.ToInt32(p.SearchColumn3)
              select val).Distinct();
values = values.OrderBy(x => x);

另外,你可以把order by statement和第一个结合起来,就可以了。

于 2011-08-19T03:46:13.283 回答