Вызов пользовательских функций в Entity Framework 4 - PullRequest
21 голосов
/ 17 августа 2010

У меня есть пользовательская функция в базе данных SQL Server 2005, которая возвращает немного.Я хотел бы вызвать эту функцию через Entity Framework.Я искал вокруг и мне не повезло.

В LINQ to SQL это было неприлично просто, я просто добавил бы функцию в модель контекста данных, и я мог бы назвать ее так.

bool result = FooContext.UserDefinedFunction(someParameter);

Используя Entity Framework, я добавил эту функцию в свою модель, и она отображается в папке SomeModel.Store \ Stored Programs в браузере моделей.

Модель не сгенерировала код для функции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();

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

Не удалось найти FunctionImport 'UserDefinedFunction' в контейнере 'FooEntities'.

Имена были изменены для защиты невинных.

tldr:Как вызвать пользовательские функции со скалярными значениями, используя Entity Framework 4.0?

Ответы [ 7 ]

22 голосов
/ 17 августа 2010

Я наконец-то решил: 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.

6 голосов
/ 14 августа 2015

Если вы хотите вызвать табличную функцию в MS SQL через Entity Framework;Вы можете использовать это:

var retval = db.Database.SqlQuery<MyClass>(String.Format(@"select * from dbo.myDatabaseFunction({0})", id));
6 голосов
/ 26 марта 2014

вызов пользовательской функции 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();
   }
}
4 голосов
/ 23 июля 2011

Вызов функции в EF4 с ODPNET beta 2 (Oracle), который возвращает НОМЕР:

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);
}

Я добавляю это здесь, потому что на основе кода Злого Голубя я мог бы выяснить это для Oracle. (Также проголосовал его ответ).

3 голосов
/ 03 января 2012

ObjectResult result = context.ExecuteStoreQuery ("выберите EmployeeName от пользователя, где Id = {0}", 15);

http://msdn.microsoft.com/en-us/library/ee358758.aspx

1 голос
/ 17 августа 2010

Вы можете найти это полезным. Казалось бы, вы можете вызывать их только через eSQL напрямую, без использования Linq.

0 голосов
/ 10 апреля 2014

думал id добавить примечание для всех, кто сталкивался с этим, если ваш параметр функции sql обнуляется, вы должны вызвать функцию в sql со значением параметра "default".Чтобы вызвать такую ​​функцию с помощью Entity Framwork, попробуйте

bool result = FooContext.CreateQuery<bool>(
"SELECT VALUE FooModel.Store.UserDefinedFunction(null) FROM {1}"
).First();
...