Как вызвать функцию Oracle с возвращаемым значением, используя LINQ to Entities? - PullRequest
5 голосов
/ 19 мая 2011

Я работаю над приложением, которое обращается к данным из базы данных Oracle 11g. Я использую EF4 и доступ к данным осуществляется с помощью LINQ. Я столкнулся со сценарием, в котором мне нужно вызвать функцию, хранящуюся в пакете. Эта функция также имеет возвращаемое значение. Я добавил эту функцию в модель данных объекта, но не могу выполнить «Добавление функции импорта» для нее. Поэтому я не могу получить к нему доступ через LINQ. Как я могу вызвать эту функцию, а также получить ее возвращаемое значение?

Я задал этот вопрос некоторое время назад, но пока не получил никакого ответа. В любом случае, я обновляю его некоторыми деталями, чтобы другим было удобно понимать проблему и направлять меня в правильном направлении. Я пытался реализовать решение, предложенное в этом вопросе , но получаю исключение.

Я добавил следующее в файл designer.cs моей модели данных сущности:

   [EdmFunction("TestModel.Store", "TestFunction")]
    public int TestFunction(decimal ALNR, decimal ATID, decimal AUKENR)
    {
        throw new ApplicationException();
    }

Ниже приведена небольшая часть файла edmx:

<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
<!-- EF Runtime content -->
    <edmx:Runtime>
    <!-- SSDL content -->
        <edmx:StorageModels>
           <Schema Namespace="TestModel.Store" Alias="Self" Provider="Oracle.DataAccess.Client" ProviderManifestToken="11g" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
               <Function Name="TestFunction" ReturnType="number" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName="PKG_TURNUS.SUMUKE" Schema="SYSTEM">
      <Parameter Name="ATID" Type="number" Mode="In" />
      <Parameter Name="ALNR" Type="number" Mode="In" />
      <Parameter Name="AUKENR" Type="number" Mode="In" />
    </Function>

Вот как я вызываю эту функцию:

var selectQuery = from T in _context.Table1
                  join A in _context.Table2 on T.columnA equals A.columnB
                  join TU in _context.Table3 on T.columnC equals TU.columnD
                  where T.columnD == 5 && T.columnE == someVariable
                  select new someType
                  {
                      propertyA = A.columnG,
                      propertyB = _context.TestFunction(T.columnE, A.columnF, TU.columnH) 
                  };  

Но когда я делаю любое из следующего:

ObservableCollection<someType> weekTotaldata = new ObservableCollection<someType>(selectQuery);  //Exception thrown at runtime

или

foreach (var ttu in selectQuery) //Exception thrown at runtime
{
    double testval = ttu.propertyB;
} 

Я получаю исключение, которое выдается в этой функции "ApplicationException". Не должно ли это Возникает ли исключение, когда эта функция вызывается где-либо еще, кроме запроса L2E?

Что я делаю не так? Как я могу вызвать функцию оракула из Linq-To-Entities? Обратите внимание, что функция, которую я пытаюсь вызвать, - это не встроенная функция Oracle, а определенная пользователем функция.

1 Ответ

4 голосов
/ 23 июня 2011

Поскольку я работал над EF4 с использованием Oracle, импорт функций здесь не работает.Несколько месяцев назад я столкнулся с той же проблемой и попытался импортировать функцию, но безуспешно.Но во время поиска я нашел ссылку на OTN, в которой говорится, что (хранимые функции Oracle не поддерживаются) .EF4 пока не дает нам возможности вызывать функцию оракула.Даже используя хранимые процедуры, вам нужно будет выбрать хранимые процедуры, которые возвращают курсор ref.Поддерживаемые хранимые процедуры включают процедуры и методы пакета, которые не имеют возвращаемого значения, но могут иметь параметры OUT или IN OUT.

Вот ссылка

Но если вывы используете сервер Sql, как вы можете выполнить импорт пользовательских функций в EF4.Вот несколько ссылок, которые могут вам помочь:

Ссылка1

Ссылка2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...