2011-10-26 10 views
5

一部のコードをEntity Frameworkを使用するように移行し、Nullableフィールドで並べ替えるクエリがあり、既定の並べ替え値を提供します。 Nullable.GetValueOrDefault(T)機能。OrderBy on Nullable <int>既定値のEntity Framework

しかし、実行時には、次のエラーを返します:this answer I can see that there is a way to provide "translations" within your EDMXから

int magicDefaultSortValue = 250; 
var query = context.MyTable.OrderBy(t => t.MyNullableSortColumn 
              .GetValueOrDefault(magicDefaultSortValue)); 

LINQ to Entities does not recognize the method 'Int32 GetValueOrDefault(Int32)' method, and this method cannot be translated into a store expression.

クエリは次のようになります。この合体機能に似た翻訳を書くことができますか?

注:私が試したときに、GetValueOrDefaultの代わりに??の演算子が合致していて、それが機能します。だから、おそらく何がその仕事をすることができますレバレッジ?

答えて

12

私はあなたの答えを見つけたと信じています。 ??を使用する場合、値がnullの場合は、CASEを使用してソート値を選択してからEFがSQLを生成し、ソートします。私はあなたのEFモデルと連携させて、SQLが生成されて表示されますLINQPadを取得して推薦する、脇

-- Region Parameters 
DECLARE p__linq__0 Int = 250 
-- EndRegion 
SELECT 
[Project1].[MyColumn1] AS [MyColumn1], 
[Project1].[MyNullableSortColumn] AS [MyNullableSortColumn] 
FROM (SELECT 
    CASE WHEN ([Extent1].[MyNullableSortColumn] IS NULL) THEN @p__linq__0 ELSE [Extent1].[MyNullableSortColumn] END AS [C1], 
    [Extent1].[MyColumn1] AS [MyColumn1], 
    [Extent1].[MyNullableSortColumn] AS [MyNullableSortColumn] 
    FROM [dbo].[MyTable] AS [Extent1] 
) AS [Project1] 
ORDER BY [Project1].[C1] ASC 

として:

MyTable.OrderBy (t => t.MyNullableSortColumn ?? magicDefaultSortValue).ToArray(); 

は、次のSQLを生成します。また、EntityFunctionsクラスとSqlFunctionsクラスについては、いくつかの便利な機能へのアクセスを提供するため、知っておくと便利です。

+0

ありがとうございます!しかし、 '?? 'が見つかった後は、すでにGetValueOrDefault()を使用していた既存のクエリ(LINQ To SQLコンテキストに対して)を編集する必要がないようにしたいと考えていました。 – Reddog

関連する問題