0

Windows 8 ストア アプリケーションで OData サービスを使用する際に問題があります。

私がこれを行う場合:

IEnumerable<vw_mobSurveyor> lstSurveyors =
    await ((DataServiceQuery<vw_mobSurveyor>)ODataContext.vw_mobSurveyor
        .AddQueryOption("$filter", "intSurveyorID eq " + intID.ToString()))
        .ExecuteAsync("GetByID").ConfigureAwait(false);

それは機能し、URI の末尾は:/vw_mobSurveyor?$filter=intSurveyorID eq 1です。この URI は、ブラウザで試してみても機能するので、問題ありません。

しかし、もしそうなら:

IEnumerable<vw_mobSurveyor> lstSurveyors = 
    await ((DataServiceQuery<vw_mobSurveyor>)ODataContext.vw_mobSurveyor
        .Where(s => s.intSurveyorID == intID))
        .ExecuteAsync("GetByID").ConfigureAwait(false);

これは Client Internal Error 4 で失敗します。URI の末尾が異なります:/vw_mobSurveyor(2)この URI をブラウザーで試すと失敗するため、コードが生成するときに失敗します。

これら2つは、生成されたURIで同等である必要があることを読みました: http://msdn.microsoft.com/en-us/library/ee622463.aspx#filtering

将来的には Linq 式を渡したいので、2 番目のバージョンを機能させる必要があります。では、2 番目のバージョンを強制的に使用するにはどうすればよい$filterでしょうか?

更新: $filter を使用した作業コードの Fiddler 出力

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 1057
Content-Type: application/atom+xml;type=feed;charset=utf-8
Server: Microsoft-IIS/7.0
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 18 Jan 2013 11:35:34 GMT

<?xml version="1.0" encoding="utf-8"?>
<feed xml:base="http://MYSERVER/TESTAPP%20V1/DataService.svc/"
xmlns="http://www.w3.org/2005/Atom"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <id>http://MYSERVER/TESTAPP%20V1/DataService.svc/vw_mobSurveyor</id>
  <title type="text">vw_mobSurveyor</title>
  <updated>2013-01-18T11:35:34Z</updated>
  <link rel="self" title="vw_mobSurveyor" href="vw_mobSurveyor" />
  <entry>
    <id>http://MYSERVER/TESTAPP%20V1/DataService.svc/vw_mobSurveyor(2)</id>
    <category term="SurveyProModel.vw_mobSurveyor" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link rel="edit" title="vw_mobSurveyor" href="vw_mobSurveyor(2)" />
    <title />
    <updated>2013-01-18T11:35:34Z</updated>
    <author>
      <name />
    </author>
    <content type="application/xml">
      <m:properties>
        <d:intSurveyorID m:type="Edm.Int32">2</d:intSurveyorID>
        <d:vchName>Bob Green 2</d:vchName>
        <d:vchStatus>Surveyor</d:vchStatus>
      </m:properties>
    </content>
  </entry>
</feed>

更新:失敗したコードの Fiddler 出力

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 824
Content-Type: application/atom+xml;type=entry;charset=utf-8
Server: Microsoft-IIS/7.0
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 18 Jan 2013 11:33:30 GMT

<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="http://MYSERVER/TESTAPP%20V1/DataService.svc/"
xmlns="http://www.w3.org/2005/Atom"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <id>http://MYSERVER/TESTAPP%20V1/DataService.svc/vw_mobSurveyor(2)</id>
  <category term="SurveyProModel.vw_mobSurveyor" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
  <link rel="edit" title="vw_mobSurveyor" href="vw_mobSurveyor(2)" />
  <title />
  <updated>2013-01-18T11:33:30Z</updated>
  <author>
    <name />
  </author>
  <content type="application/xml">
    <m:properties>
      <d:intSurveyorID m:type="Edm.Int32">2</d:intSurveyorID>
      <d:vchName>Bob Green 2</d:vchName>
      <d:vchStatus>Surveyor</d:vchStatus>
    </m:properties>
  </content>
</entry>
4

2 に答える 2

0

ビューをクエリしているようです。エンティティ モデルにエンティティ キー プロパティを設定しましたか?

于 2013-01-17T17:36:04.243 に答える
0

これは、WCF Data Services クライアントのバグのようです。

一見したところ、提供された Fiddler トレースに問題は見られませんが、これを再現して、内部バグを報告します。エラーの完全なスタック トレースがある場合は、非常に役立ちます。

注: LINQ から URI への変換ビットは、ここで正しいことを行っています。句がエンティティのキ​​ー値のみをチェックしている場合、メカニズム.Whereを使用する代わりに、エンティティをそのキー (つまり、../vw_mobSurveyor(2)) で直接検索することにより、クエリを最適化します$filter。これにより、フィードではなくエントリ応答ペイロードが生成され、Fiddler から取得したものと一致します。

また、元の質問に答えるために$filter、述語にエンティティ キー以外のものを含めることで、LINQ トランスレータに強制的に使用させることができます。たとえば、次のようなことができます。

.Where(s => s.intSurveyorID == intID && true)

これは明らかにハックですが、うまくいくはずです。理想的には、このバグを見つけて修正し、より正常に見える Where 句を使用できるようにします:)。

于 2013-01-25T17:54:22.300 に答える