2017-09-11 18 views
1

私はそうのようにEntity Frameworkのを使用していくつかのデータをretriveing AMでページングを組み合わせる:Entity Frameworkの:動的LINQのOrderBy

var items = GetItems(storeNumber); 

Sort(items); 

Page(items); 

return await items.ToListAsync(); 

私は、これらのプライベートヘルパーメソッドがあります:

private IQueryable<Item> GetItems(string storeNumber) 
{ 
    return _dbContext.Items.Where(x => x.StoreNumber == storeNumber); 
} 

私はダイナミックを使用して結果をソートしますLINQ。私のページの方法で

private void Sort(IQueryable<Item> items, string fieldToSort, string sortDirection) 
{ 
    items = items.OrderBy($"{fieldToSort} {sortDirection}"); 
} 

私は例外

方法を得る「のOrderBy」メソッドの前に呼び出す必要があり、私はその理由と疑っていた

private void Page(IQueryable<Item> items, int skip, int take) 
{ 
    items = items.Skip(skip).Take(take); 
} 

を「スキップ」エラーはアイテムがIOrderedQueryable<Item>である必要がありますがであるため、を返すダイナミックLINQ OrderByのオーバーロードはありません。 ソートコードとページコードを同じメソッドに抽出して、varを使用しても問題はなくなったので、その型を推定します。この問題は、並べ替えとページング時にIQueryableインターフェイスを使用しているようです。このロジックを別々のメソッドに分割する方法もありますが、ソートにはまだ動的LINQを使用していますか?

ご迷惑をおかけして申し訳ありません。

+1

問題ははるかに自明です。現在のところ、 'Sort'メソッドは、クエリー可能な演算子を適用して結果を返さないため、効果がありません(' Page'とLINQメソッドも同様です)。 'IQueryable 'を返すメソッドに変更することを検討してください。 'private IQueryable ソート(...){戻り値items.OrderBy(...); } '。返された結果も使用することを忘れないでください。 –

+0

@IvanStoevメソッドは無効ですが、参照として項目を渡していますか?私は項目を拡張クエリ可能に設定しています。たぶん私は混乱している? – benjrb

+1

オブジェクトへの参照をアイテム(メソッド内のローカル変数)に渡しています。次に、項目(まだローカル変数)を変更して、メソッドを終了します。あなたが望むもの(外側**アイテム**を変更する)を達成するには、 'ref IQueryable items'を使うか、ローカル変数' items'を返す必要があります。 'return ...'を使うことは、はるかに一般的なアプローチです。 –

答えて

2

GetItems()と同じように、新しく作成したIQueryableをSort()メソッドとPage()メソッドから返す必要があります。 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-parameters:あなたはこのようなメソッドの内部パラメータ値を「書き換え」場合はC#は

以上の参照のためにこれを参照してくださいすることにより、値のパラメータ渡しセマンティクスを使用しているため は、それは、もともとパラメータに渡された値には影響しません

+0

SortとPageメソッドへの参照としてアイテムを渡していますか、混乱していますか? – benjrb

+0

IQueryableはインターフェイスなので、参照型ですが、パラメータを参照渡ししているわけではありません。 2つは無関係です:参照型を値で渡すことができます(デフォルトのセマンティクス)。または、参照型で渡すことができます。参照型(基本的にはメモリアドレス)を値で渡しています(新しいブロックが割り当てられ、参照がコピーされますが、割り当てを行うと古いものはそのまま残ります)。 詳細については、このドキュメントの例を参照してください。 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-reference-type-parameters –

関連する問題