缺点:
有没有办法实现使用Entity Framework的服务操作,但是执行存储过程调用而不是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”类型作为集合,则无法实现基元或复合体的集合。
注意:我使用这种语法运行了其他一个服务操作,它运行良好
我决定看看它是否会在浏览器中运行(作为网址)。我将这个和一个正在运行的服务操作插入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格式。
有没有办法实现使用Entity Framework的服务操作,但是执行存储过程调用?
注意:
我也尝试了以下语法,但它不起作用:
Execute<MySproc_Result>(new Uri("GetTheDataINeed?id=91675L", UriKind.Relative),
"GET" , false)
答案 0 :(得分:3)
我有一个与此非常相似的问题。解决方案是在DataContext中创建一个返回相关类型的属性。 为了更清楚一点,我在这个服务上有一个方法:
[WebGet()]
public IQueryable<VolumeSlaReportSummary> GetVolumeSlaSummary(...)
{
...
return this.CurrentDataSource.GetVolumeSlaSummary(...);
}
当我调用该方法时,我得到了格式为&lt; GetVolumeSlaSummary ....的XML,而不是预期的&lt; feed ...
所以,在DataContext中,我创建了一个这样的属性:
public IQueryable<VolumeSlaReportSummary> VolSlaSummary
{
get
{
return this.GetVolumeSlaSummary(...);
}
}
现在调用该方法将返回预期的&lt; feed ...样式XML。