从.NET客户端使用ADO.NET数据服务的服务操作

时间:2009-10-13 10:10:41

标签: linq linq-to-entities wcf-data-services service-operations

我正在尝试构建一个包含大量实体和一些服务操作的ADO.NET数据服务。一方面,我创建了一个ASP.NET Web应用程序,其中包含ADO.NET实体数据模型和ADO.NET数据服务。另一方面,我创建了第二个ASP.NET Web应用程序,它具有对数据服务的服务引用。

实体很顺利,我可以使用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();

这很有效。但是,通过服务操作检索信息完全不适合我。 数据服务端代码:

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

当我将服务引用添加到我的客户端项目时,Visual Studio没有接受任何服务操作。我知道我可以通过构造的URI和Da​​taServiceContext对象或TestEntities对象的BeginExecute方法(在这种情况下)或类似的东西来访问它们,但这不是我想要的。

我想要的是使用LINQ来查看服务操作的返回数据。 这可能吗?它应该是,对吧?

1 个答案:

答案 0 :(得分: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();
}