实现调用存储过程的“WCF数据服务”服务操作

时间:2013-07-03 00:03:53

标签: .net entity-framework wcf-data-services odata

缺点:

有没有办法实现使用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的服务操作,但是执行存储过程调用?

注意:

  • 我在服务器和客户端上运行WCF Data Services 5.5.0并安装了5.3.0工具。
  • 我尝试在控制台应用程序中运行(以确保它不仅仅是linqpad)
  • 我也尝试了以下语法,但它不起作用:

    Execute<MySproc_Result>(new Uri("GetTheDataINeed?id=91675L", UriKind.Relative),
                            "GET" , false)
    

1 个答案:

答案 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。