Я работаю над приложением, которое обращается к данным из базы данных 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, а определенная пользователем функция.