它的短处:
有没有办法实现使用实体框架的服务操作,但执行存储过程调用而不是 Linq to Entities?
细节:
我有一个 OData(WCF 数据服务),其中包含多个服务操作。他们都工作正常。
今天我尝试添加一个新的服务操作,但我无法让它在 LinqPad 中工作。
我的新服务操作不同于其他操作,因为它调用存储过程(而不是使用 Linq To Entities)。
它看起来像这样:
[WebGet]
public IQueryable<MySproc_Result> GetTheDataINeed(long id)
{
return CurrentDataSource.MySproc(id).AsQueryable();
}
当我像这样在 LinqPad 中运行它时:
CreateQuery<MySproc_Result>"GetTheDataINeed").AddQueryOption("id", "91675L")
我收到以下错误:
如果类型 'LINQPad.User.MySproc_Result' 不是集合,则无法具体化基元或复合体的集合。
注意:我使用此语法运行了我的其他服务操作之一,它运行良好
我决定看看它是否会在浏览器中运行(作为 url)。我将这个和一个工作服务操作都插入到 Internet Explorer 中。
差异很容易立即看出:
坏的
<?xml version="1.0" encoding="UTF-8"?>
<GetTheDataINeed xmlns:m="namespace removed for brevity">
<element m:type="MyModel.MySproc_Result">
<SomeData>Data Goes Here</SomeData>
<OtherData>Other Data Goes Here</OtherData>
...
好的
<?xml version="1.0" encoding="utf-8" ?>
<feed xml:base="http://localhost:26257/MyServiceHere.svc/" Other xmlns ommited>
<id>http://localhost:26257/MyServiceHere.svc/ValidServiceOperation</id>
<title type="text">ValidServiceOperation</title>
<updated>2013-07-02T23:24:11Z</updated>
<link rel="self" title="ValidServiceOperation" href="ValidServiceOperation" />
<entry>
<id>http://localhost:26257/MyServiceHere.svc/Orders(156L)</id>
<category ... ommited />
<link lots of links ommited />
<title />
<updated>2013-07-02T23:24:11Z</updated>
<author>
<name />
</author>
<content type="application/xml">
<m:properties>
<d:SomeData m:type="Edm.Int64">Some Data Here</d:SomeData>
<d:OtherData m:type="Edm.DateTime">Other Data Here</d:OtherData>
...
工作的似乎有相当多的元数据,而非工作的则缺少这些元数据。我猜这就是物化器失败的原因。我不知道的是如何让我的服务操作调用存储过程来获取该 xml 格式。
有没有办法实现使用实体框架但执行存储过程调用的服务操作?
笔记:
- 我在服务器和客户端上都运行 WCF Data Services 5.5.0 并安装了 5.3.0 工具。
- 我尝试在控制台应用程序中运行(以确保它不仅仅是 linqpad)
我也尝试了以下语法,但它不起作用:
Execute<MySproc_Result>(new Uri("GetTheDataINeed?id=91675L", UriKind.Relative), "GET" , false)