3

私はそれが本当に簡単であるべきだと思いますが、それを行う方法が見つかりません。int 型の 1 つの列を選択する linq クエリがあり、並べ替える必要があります。

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

例に戻るとx、メソッド内の変数はOrderByとして扱われる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);

また、ステートメントごとの順序と最初のステートメントを組み合わせることができます。これで問題ありません。

于 2011-08-19T03:46:13.283 に答える