2012-04-24 3 views
1

にクエリのために必要な回避策は、:LINQクエリは、テーブルの主キーで生成されたSilverlightのアプリ内のエンティティへのLINQを使用している間、主キー

var query = (from b in PHOTOS 
where b.RECORDID == selectedRecordId 
select b); 

それがこのhttp://localhost/DataService.svc/PHOTOS('123456')ようになります。これは、(驚いたことに)PK制約を実施しなかった古いDBで同じコードを使用する必要があるまでは問題ありません。結果は誤りで一つのレコードに続く返されます。http://localhost/DataService.svc/PHOTOS()?$filter=RECORDID eq '123456':私はこのような手でクエリを書き換えた場合

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
    <code></code> 
    <message xml:lang="en-US">An error occurred while processing this request.</message> 
    <innererror> 
    <message>A single resource was expected for the result, but multiple resources were found.</message> 
    <type>System.InvalidOperationException</type> 
    <stacktrace> at System.Data.Services.Serializers.Serializer.WriteRequest(IEnumerator queryResults, Boolean hasMoved)&#xD; 
    at System.Data.Services.ResponseBodyWriter.Write(Stream stream)</stacktrace> 
    </innererror> 
</error> 

この問題は消えます。 LINQコードを書くと、カッコでPKの代わりに$フィルタを使用するように強制できますか?このテーブルのすべての結果が必要なので、最初のものを取得するだけでは機能しません。

答えて

1

試してみてください(そのIDを持つレコードが存在しない場合には、通常、何も、またはオブジェクトのデフォルト)

var query = (from b in PHOTOS 
      where b.RECORDID == selectedRecordId 
      select b).FirstOrDefault; 

これは、単一の結果を強制します。

編集:私は私の目の前でIDEなしで、現時点では確認できない以下のコメントをベースにしたソリューションで

第二の試み、:

var query = (from b in PHOTOS 
      select b).Where(p => p.RECORDID == selectedRecordId); 

私の推論がありますwhere句を最初のクエリの外に移動すると、強制的にフィルタになる可能性があります。

これはうまくいきませんが、私の唯一のもう一つの考えは、EFスキーマを変更してPHOTOSをオーバーライドして、プライマリキーを持たないようにすることです。

+0

有効な回避策については、Upvoteを参照してください。上記の編集。具体的には、これは非同期Silverlight呼び出しでは機能しません。 – jordanpg

+0

他にもいくつかアイデアがあります。 – MCattle

+0

追加のアイデアありがとう。私が2つのフォームが機能的に同一であることを覚えているので、Where()は問題を解決しません。明らかに、スキーマを変更すれば問題は解決しますが、それはオプションではありません。 – jordanpg

関連する問題