0

モジュール式の Linq クエリを (OData ソースに対して) 作成しようとしています。

これは私のクエリの簡略化されたバージョンです:

// Any clause that I want to be modular
Func<Encounter, bool> orderAnyClause = x => x.OrderName.StartsWith("Order 00");

// Query using the any clause
var result = entities.Customers.Where(cust=> cust.Orders.Any(orderAnyClause));

// A method to do the selection.  It works just fine.
IQueryable<SearchSelectionResult> selectedResults = SelectResults(result); 

// This throws the exception shown below
var list = selectedResults.ToList();  

これはすべて正常にコンパイルされますが、実行すると any 句で次の例外が発生します。

タイプ 'System.Linq.Expressions.ConstantExpression' のオブジェクトをタイプ 'System.Linq.Expressions.LambdaExpression' にキャストできません。

ステートメントにthe句を埋め込むと、すべて正常に機能するため、それがany句であることはわかっています。

このエラーが発生するのはなぜですか? そして、どうすればこのステートメントを壊してエラーを出さないようにできますか?


更新: 式の使用

次のような表現を使ってみました。

Expression<Func<Encounter, bool>> orderAnyClause = 
                                      x => x.OrderName.StartsWith("Order 00");

そして、次のコンパイル時エラー メッセージが表示されます。

Instance argument: cannot convert from System.Data.Services.Client.DataServiceCollection<ODataComponetizedQueriesTest.MyEntities.Order>' to 'System.Linq.IQueryable<ODataComponetizedQueriesTest.MyEntities.Order>'
4

2 に答える 2

5

次のように orderAnyClause を定義してみてください。

Expression<Func<Encounter, bool>> orderAnyClause = 
                                        x => x.OrderName.StartsWith("Order 00");

私はそれをテストしませんでしたが、クエリの理解が機能する方法 (およびエラーに基づいて) は、式として取得しない限り、何も実行できません。

于 2013-03-26T20:07:47.080 に答える
0

クエリを変換するには、式ツリーIQueryableを操作する必要があります。つまり、コードを単なる実行可能コードとしてではなく、データとして表示する必要があります。

これが機能するかどうかは100%確信が持てませんが、以下を使用できることを願っています:

Expression<Func<Encounter, bool>> orderAnyClause =
    x => x.OrderName.StartsWith("Order 00");

...そして、同じコードを保持します。そうすれば、orderByClause変数はデリゲートではなく式ツリーを参照します。ここで別のラムダ式で使用しているため、これが機能しない可能性があります。

cust => cust.Orders.Any(orderAnyClause)

...そして、そのラムダ式式ツリーに変換されます。それは、OData プロバイダーがそれをどう処理するかに大きく依存します。を構築するためにファンキーなことを行うメソッドを作成する必要があるかもしれませんcust.Orders.Any(orderAnyClause)、最初に簡単な方法を試す価値があります。

于 2013-03-26T20:07:54.970 に答える