Вызов пользовательских функций в Entity Framework 4
У меня есть пользовательская функция в базе данных SQL Server 2005, которая возвращает бит. Я хотел бы назвать эту функцию через Entity Framework. Я искал вокруг и не имел большой удачи.
В LINQ to SQL это было неприлично легко, я бы просто добавил функцию в модель контекста данных, и я мог бы назвать ее так.
bool result = FooContext.UserDefinedFunction(someParameter);
Используя Entity Framework, я добавил эту функцию в свою модель, и она появляется в SomeModel.Store\Хранимые процедуры в браузере моделей.
Модель не создала код для функции, XML для файла .edmx содержит:
<Function Name="UserDefinedFunction" ReturnType="bit" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<Parameter Name="someParameter" Type="int" Mode="In" />
</Function>
Ближайшим, что я мог получить, было что-то вроде этого:
bool result = ObjectContext.ExecuteFunction<bool>(
"UserDefinedFunction",
new ObjectParameter("someParameter", someParameter)
).First();
Но я получил следующее сообщение об ошибке:
ФункцияИмпорт "UserDefinedFunction" не может быть найденный в контейнере "FooEntities".
Имена изменены для защиты невинных.
TL;DR: Как вызвать скалярно-оцененные пользовательские функции с помощью Entity Framework 4.0?
Ответы
Ответ 1
Наконец-то я решил: D Для скалярных функций вы можете добавить предложение FROM {1}.
bool result = FooContext.CreateQuery<bool>(
"SELECT VALUE FooModel.Store.UserDefinedFunction(@someParameter) FROM {1}",
new ObjectParameter("someParameter", someParameter)
).First();
Это определенно для использования LINQ to SQL над EF.
Ответ 2
вызов пользовательской функции статического типа SQL
Вы можете использовать ExecuteStoreQuery
,
- первый параметр принимает оператор вызова функции SQL в формате строки
- второй параметр принимает объект класса
SqlParameter
, в котором вы передаете свое имя параметра функции с его значением. как показано ниже.
public string GetNumberOFWorkDays(Guid leaveID)
{
using (var ctx = new INTERNAL_IntranetDemoEntities())
{
return ctx.ExecuteStoreQuery<string>(
"SELECT [dbo].[fnCalculateNumberOFWorkDays](@leaveID)",
new SqlParameter { ParameterName = "leaveID", Value = leaveID }
).FirstOrDefault();
}
}
Ответ 3
Вызов функции в EF4 с бета-версией ODPNET 2 (Oracle), которая возвращает NUMBER:
using (var db = new FooContext())
{
var queryText = "SELECT FooModel.Store.MY_FUNC(@param) FROM {1}"
var result = db.CreateQuery<DbDataRecord>(queryText,new ObjectParameter("param", paramvalue));
return result.First().GetDecimal(0);
}
Я добавляю его здесь, потому что на основе кода Evil Pigeon я мог бы понять это для Oracle. (Также поддержал его ответ).
Ответ 4
ObjectResult result = context.ExecuteStoreQuery( "выберите EmployeeName от пользователя, где Id = {0}", 15);
http://msdn.microsoft.com/en-us/library/ee358758.aspx
Ответ 5
Если вы хотите вызвать табличную функцию в MS SQL через Entity Framework;
Вы можете использовать это:
var retval = db.Database.SqlQuery<MyClass>(String.Format(@"select * from dbo.myDatabaseFunction({0})", id));
Ответ 6
Вы можете найти этот полезный. Похоже, вы можете звонить только через eSQL напрямую и не использовать Linq.
Ответ 7
Идентификатор мысли добавляет примечание для любого другого, кто сталкивается с этим, если ваш параметр функции sql имеет значение NULL, вам нужно вызвать функцию в sql с параметром "default". Чтобы вызвать функцию, подобную функции Entity Framwork, попробуйте
bool result = FooContext.CreateQuery<bool>(
"SELECT VALUE FooModel.Store.UserDefinedFunction(null) FROM {1}"
).First();