1

它的短处:

有没有办法实现使用实体框架的服务操作,但执行存储过程调用而不是 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)
    
4

1 回答 1

3

我有一个与此非常相似的问题。解决方案是在返回相关类型的 DataContext 中创建一个属性。为了更清楚一点,我在服务上有一个方法,如下所示:

    [WebGet()]
    public IQueryable<VolumeSlaReportSummary> GetVolumeSlaSummary(...)
    {
        ...
        return this.CurrentDataSource.GetVolumeSlaSummary(...);
    }

当我调用该方法时,我得到了 <GetVolumeSlaSummary.... 形式的 XML,而不是预期的 <feed...

因此,在 DataContext 中,我创建了如下属性:

    public IQueryable<VolumeSlaReportSummary> VolSlaSummary
    {
        get
        {
            return this.GetVolumeSlaSummary(...);
        }
    }

现在调用该方法会返回预期的 <feed... 样式 XML。

于 2013-07-31T12:44:50.113 回答