11

LinqPadのNorthWind.sdfを使用して、次のステートメントを正常に実行しました。

from s in Shippers
    select new
{
    s.ShipperID,
    s.CompanyName,      
    Count=s.ShipViaOrders.Count()       
}

同時に、LinqPadのOdataサービス(http://services.odata.org/northwind/northwind.svc)で同様のステートメントを実行できませんでした。

from s in Shippers    
select new
{
    s.ShipperID,
    s.CompanyName,      
    Count=s.Orders.Count()      
}

エラーは、「式s.Orders.Count()を使用したタイプ<> f__AnonymousType0`3 [System.Int32、System.String、System.Int32]のインスタンスの構築または初期化はサポートされていません。」です。

LinqサポートではODataサービスが非常に制限されていることを知っています。アプリケーションで動的Linqステートメントをサポートしています。実際、データソースをCompactSQLServerからODataサービスに移行しようとしています。

したがって、一般的な方法でNotSupportedExceptionに対処する必要があります。現在、実行する前に、プロパティ定義の構文を確認しようとしています。

"s.Orders.Count() as Count"   

チェックに合格しましたが、ODataのNotSupportedExceptionに適合しました。

プロパティ定義(文字列またはラムダによる)がLinqプロバイダーでサポートされているかどうかを確認する方法はありますか?

任意の提案をいただければ幸いです。

イン

4

2 に答える 2

6

残念ながら、LINQ プロバイダーが特定のクエリを変換できるかどうかをプログラムで確認する一般的な方法はありません。通常、ドキュメントに頼るか、(確かに) 実際に実行しているクエリを試してみる必要があります。

ただし、さまざまなプロバイダーが、クエリの何らかの表現を生成するメカニズムを提供している場合があります。これを使用して、クエリを実行しなくても機能するかどうかを確認できます。

OData クライアントの場合、クエリで .ToString() を呼び出すことができ、クエリを正常に処理できる場合は URL を返す必要があります。そうしないと、「Linq 式を URI に変換中にエラーが発生しました: ...」のようなエラー メッセージが返されます (実際のエラー メッセージはユーザーの言語によって異なる場合がありますが、有効な URI ではないことは間違いありません)。

于 2011-02-11T07:18:45.003 に答える
2

残念ながら、LINQ プロバイダーの作成者がサポートされていないものの詳細なリストを提供している場合、特定のクエリをテストするか、ドキュメントを介して確認するしかありません。

LINQ 自体には、IQueryable/IEnumerable で定義された拡張メソッドによって大部分が定義された非常に緩い仕様があります。LINQ プロバイダーを実装するということは、データ ソースに対する変換を実装する必要があることを意味します。たとえば、LINQ to SQL は、LINQ クエリで表現された式ツリーを、データベース プロバイダーが理解できる SQL に変換します。各データ ソースには独自の制限があり、最終的にサポートできるものを決定します。同様に、各 LINQ プロバイダーは、特定のメソッドまたは動作を実装する (または実装しない) ことを選択できます。

これは、OData を処理するための LINQPad 内のプロバイダーの単なる制限である可能性があります。代わりに OQuery をチェックして、より優れた機能セットが提供されるかどうかを確認してください。http://をご覧ください。詳細とダウンロードについては、 beta.code.msdn.microsoft.com/OQuery-Building-OData-d2e75eedを参照してください。

于 2011-02-15T04:11:55.063 に答える