4

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

实体通过很好的未来,我可以使用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来通过服务操作返回的数据。 这可能吗?应该是吧?

回答

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(); 
} 
+0

好吧,但你如何调用从客户端的“OrdersByRegion”操作?您是否必须手动构建REST URL(例如http://server/service.svc/OrdersByRegion?regionId = 1)?谢谢。 – 2009-11-17 15:11:02

+1

嗨Ciprian,是的,不幸的是你做的。 string.format通常是最好用的。看到我的第一个代码示例演示如何调用它 – dmportella 2009-11-17 22:48:16

+0

对不起,我忘记将其标记为接受的答案(我正在浏览我的问题),那时我有点沮丧,URL不会自动生成。谢谢。 – pancake 2011-07-30 07:01:30

相关问题