4

多数のエンティティといくつかのサービス操作を使用してADO.NETデータサービスを構築しようとしています。一方では、ADO.NETエンティティデータモデルとADO.NETデータサービスが配置されているASP.NETWebアプリケーションを作成しました。反対側では、データサービスへのサービス参照を持つ2番目のASP.NETWebアプリケーションを作成しました。

エンティティは非常にうまく機能しています。LINQを使用して、必要なデータを取得できます。

TestEntities entities = new TestEntities(
            new Uri("http://localhost/service/service.svc"));

var query = from customer in entities.Customers
                    where customer.ID == 1234
                    select customer;

query.ToList();

これは機能します。ただし、Service Operationsを介して情報を取得することは、私にはまったくわかりません。データサービス側のコード:

public static void InitializeService(IDataServiceConfiguration config) {
    config.SetEntitySetAccessRule("*", EntitySetRights.All);
    config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
}

[WebInvoke]
public IQueryable<Customer> GetSomeCustomers() {
    TestEntities entities = new TestEntities();
    return from customer in entities.Customers
        where customer.ID > 0 && customer.ID < 20
        select customer;
}

クライアントプロジェクトにサービス参照を追加したとき、VisualStudioはサービス操作を取得しませんでした。構築されたURIと、DataServiceContextオブジェクトまたはTestEntitiesオブジェクト(この場合)のいずれかのBeginExecuteメソッド、またはそのようなものを介してそれらにアクセスできることはわかっていますが、それは私が望む方法ではありません。

私が欲しいのは、LINQを使用して、サービス操作の返されたデータを調べることです。これは可能ですか?そうあるべきですよね?

4

1 に答える 1

5

一度知ったら簡単なこと。

知っておくべきいくつかのこと:

現在、DataServiceClientGenerator(EntityClassGeneratorを使用)は、サービス操作のメソッドを作成しません。

コンテキストでのCreateQueryメソッドの使用は、サービス操作ではサポートされていません。現在、クライアント側で検証が行われていないため、機能します(CreateQueryを使用すると、クエリメソッドの最後に「()」が追加されます。この「http://localhost/service.svc/method()?parameter=2」のように、CreateQueryを使用できますが、お勧めしません。

すべてのサービス操作が値を返すわけではありませんが、この例では、値を返す例のみを示します。

public partial class NorthwindEntities
{ 
    public IQueryable<Order> OrdersByRegion(int regionId)
    {
     return this.Execute<Orders>(new Uri(string.Format("{0}OrdersByCountry?regionId={1}", this.BaseUri, regionId), UriKind.RelativeOrAbsolute));
    }
}

さらに詳しい情報が必要な場合は、お気軽にご質問ください。

PS:あなたの例では、サービス操作(サーバー側)で新しいデータコンテキストを作成する必要はありません。DataServiceは、サービスが呼び出されたときにすでに参照がインスタンス化されています。

実際には、次のようにサービス側でデータコンテキストの作成をオーバーライドできます。

protected override NorthwindEntities CreateDataSource()
{
     return new NorthwindEntities();
}
于 2009-10-14T19:19:23.907 に答える