Подтвердить что ты не робот

Вызов пользовательских функций в 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?

4b9b3361

Ответ 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. (Также поддержал его ответ).

Ответ 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();