1

Silverlight アプリで LINQ to Entities を使用しているときに、テーブルの主キーでクエリが生成されると、次のようになります。

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

このように見えますhttp://localhost/DataService.svc/PHOTOS('123456')。これは、(驚くべきことに) PK 制約を適用していない古い DB で同じコードを使用する必要があるまでは問題ありません。結果として、1 つのレコードが返され、その後にエラーが続きます。

<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>

クエリを次のように手で書き直すと、この問題はなくなりますhttp://localhost/DataService.svc/PHOTOS()?$filter=RECORDID eq '123456'。括弧内の PK の代わりに $filter を強制的に使用するように LINQ コードを作成するにはどうすればよいですか? このテーブルのすべての結果が必要なので、最初の結果を取得するだけでは機能しません。

4

1 に答える 1

1

試す:

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

これにより、単一の結果が強制されます (または、その ID を持つレコードがない場合は、オブジェクトのデフォルト、通常は Nothing)。

編集:

以下のコメントに基づく解決策の 2 回目の試み。現時点では、IDE が目の前にないと確認できません。

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

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

これが機能しない場合、私の唯一の考えは、EF スキーマを変更して PHOTOS をオーバーライドし、主キーを持たないようにすることです。

于 2012-04-24T21:36:44.993 に答える