2011-08-08 2 views
14

VB.netと次のLINQステートメントを使用します。私は "Order by"がConcat()で動作しないと思う。ユーザーが現在持っているアイテムをリストし、利用可能なアイテムを順番にリストしたいと思います。ですから、最初にdbから現在のアイテムを選択し、次に使用可能なアイテムを順番に選択します。 LINQは文ごとの順序を無視し、PK(itemID)による並べ替えを行い、文を実行した直後にリストを調べました。私が声明を壊して別々に行うとき、彼らは予測どおりに働きます。任意のアイデア、提案またはコメント。 おかげで、PMLINQのConcat()で動作しません

(From items In myDatabase.ItemAssignments _ 
Where items.BuildingID = buildingID _ 
And items.ResidentID = ResidentID _ 
Select items).Concat(From moreitems In myDatabase.ItemAssignments _ 
         Where moreitems.occupied = 0 _ 
         And moreitems.BuildingID = buildingID _ 
         Order by moreitems.Floor, moreitems.ItemNumber _ 
         Select moreitems) 

答えて

14

それはSQLにLINQに来るときConcatが実際にORDER BY句を無視するん 。これは、LINQPadを使用している場合、またはDataContext.Log propertyを設定している場合に、生成されたSQLから検証できます。

これに対処する1つの方法は、匿名型を介してダミー値を導入して注文を支援することです。私は、順序を指定する必要があるまで開始したクエリ構文を使用して同じアプローチが可能ですが、わかりやすくするために以下のクエリを分割しました。

Dim firstQuery = From items In myDatabase.ItemAssignments _ 
       Where items.BuildingID = buildingID _ 
       And items.ResidentID = ResidentID _ 
       Select New With { .Row = items, .Order = 1 } 
Dim secondQuery = From moreitems In myDatabase.ItemAssignments _ 
        Where moreitems.occupied = 0 _ 
        And moreitems.BuildingID = buildingID _ 
        Select New With { .Row = moreitems, .Order = 2 } 

Dim query = firstQuery.Concat(secondQuery) _ 
         .OrderBy(Function(o) o.Order) _ 
         .ThenBy(Function(o) o.Row.Floor) _ 
         .ThenBy(Function(o) o.Row.ItemNumber) _ 
         .Select(Function(o) o.Row) 

もうあまり望ましくないオプションは、データベースからの結果を引っ張ってくるクエリのいずれか、上AsEnumerable methodを呼び出すことです。関係する項目の数に応じて、さらにフィルタリングが必要な場合は、これがパフォーマンスに悪影響を与える可能性があります。

From items In myDatabase.ItemAssignments.AsEnumerable() ... 

を意図したとおりに、あなたの第二部の順序は、その後動作し、生成されたSQLは限りが反映されます。使用するために元のクエリの最初の部分を変更するには、このアプローチにこれを使用するには