0

私はWCFにかなり慣れていません。ページングされた応答としてlinqまたはラムダを使用してWCFサービスからクエリを取得しようとしていますが、取得できません。私のコードは次のとおりです。

Dim uri As New Uri(My.Settings.Host)
Dim context As New PMXMigrationEntities(uri)
Dim token As DataServiceQueryContinuation(Of APARTMNT) = Nothing
Dim list As New List(Of APARTMNT)

Try
    ' Execute the query for all apartments and get the response object.'
    Dim response As QueryOperationResponse(Of APARTMNT) = _
        CType(context.APARTMNTs.Execute(), QueryOperationResponse(Of APARTMNT))

    ' With a paged response from the service, use a do...while loop '
    ' to enumerate the results before getting the next link. '
    Do
        ' If nextLink is not null, then there is a new page to load.'
        If token IsNot Nothing Then
            ' Load the new page from the next link URI.'
            response = CType(context.Execute(Of APARTMNT)(token),  _
            QueryOperationResponse(Of APARTMNT))
        End If

        ' Enumerate the apartments in the response.'
        For Each a As APARTMNT In response
            list.Add(a)
        Next

        ' Get the next link, and continue while there is a next link.'
        token = response.GetContinuation()
    Loop While token IsNot Nothing
Catch ex As DataServiceQueryException
    Throw New ApplicationException( _
            "An error occurred during query execution.", ex)
End Try

Return list

次のようなことをしたいと思います。

CType(context.APARTMNTs.Where(Function(a) a.city.Contains(cityStr)).Execute(), QueryOperationResponse(Of APARTMNT))

そして次のようなもの:

CType(context.APARTMNTs.Where(Function(a) a.city = cityStr).Execute(), QueryOperationResponse(Of APARTMNT))

さて、このシナリオでは、linq または lambda が、Contains 関数をサポートしない OData クエリに変換されることを読みました。私の代替手段は何ですか?

4

2 に答える 2

1

OData は、コレクションの汎用の Contains 演算子をサポートしていません (ただし、any/all では完全に真ではなくなりました)。ただし、文字列 (a.city が文字列プロパティであると仮定) では、代わりに indexof を使用できます。例えば:

http://services.odata.org/Northwind/Northwind.svc/Customers?$filter=indexof(CompanyName, 'Futt') ne -1

このクエリは、基本的に CompanyName.Contains("Futt") と同等です。LINQ では、これは次のようになります。

context.Customers.Where(Function(c) c.CompanyName.IndexOf("Futt") <> -1)
于 2013-02-22T11:25:56.700 に答える
0

長い研究と行き詰まりの後、私はそれを理解しました。DataServiceQuery を QueryOperatorResponse としてキャストすることの問題です

var query = (DataServiceQuery<TENANT>)context.TENANTs.Where(a => a.name.ToLower().Contains("jeff"));

// Execute the query for all tenants and get the response object.
   QueryOperationResponse<TENANT> response =
               (QueryOperationResponse<TENANT>)query.Execute() as QueryOperationResponse<TENANT>;
于 2013-02-22T19:58:00.610 に答える