2013-07-03 2 views
1

Краткого его:Материализуя операцию службы «службы WCF Data», который вызывает хранимую процедуру

Есть ли способ материализовать сервисные операции, которые используют Entity Framework, но сделать вызов хранимой процедуры вместо Linq к сущностям?

Детали:

У меня есть OData (WCF Service Data), которая имеет несколько сервисных операций в нем. Все работают нормально.

Сегодня я попытался добавить новую операцию обслуживания, и я не могу заставить ее работать в 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") 

Я получаю следующее сообщение об ошибке:

Cannot materialize a collection of a primitives or complex without the type 'LINQPad.User.MySproc_Result' being a collection.

Примечание: Я побежал один из моих других операций обслуживания с использованием этого синтаксиса, и он работал нормально

Я решил посмотреть, будет ли он работать в браузере (в качестве URL-адреса). Я подключил эту и рабочую службу к Internet Explorer.

Различие было легко видеть сразу:

Bad

<?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 5.5.0 на сервере и на клиенте и имеет установки 5.3.0 оснастки.
  • Я попытался запустить в консольном приложении (чтобы убедиться, что это не просто LINQPad)
  • Я попытался следующий синтаксис, как хорошо, и он не работает:

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

ответ

3

У меня была проблема, очень похожая на это. Решение заключалось в создании свойства в DataContext, который возвращал тип, о котором идет речь. Чтобы сделать это немного понятнее, я имел метод на службу, как это:

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

Когда я назвал этот метод я получил XML в виде < GetVolumeSlaSummary ...., вместо ожидаемого < корма. ..

Так, в DataContext, я создал свойство как это:

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

Вызов метод теперь возвращает ожидаемый < подачи ... стиль XML.

Смежные вопросы