Сначала база данных EF Core 2 - отображение пользовательских функций - PullRequest
0 голосов
/ 13 июня 2018

Сначала я использую EF Core 2.0 с базой данных на SQL Server 2017, он отлично работает для моих таблиц и представлений.Однако у меня возникла проблема с отображением существующих функций, имеющихся в моей базе данных.

Функция: (пример)

CREATE FUNCTION [DBO].[GETDATETIME]()
RETURNS DateTime
AS
BEGIN
    RETURN (SELECT GETDATE())
END

Запрос SQL:

SELECT GETDATETIME()

ПРОБЛЕМА:

Я хотел бы вызвать свою функцию так же (или аналогично), как мы это делаем в запросе SQL.

В некоторых примерах я нашел следующий способ:

1 - Создайте статический метод в моем классе XDbContext:

[DbFunction("dbo.GetDateTime")]
public static DateTime GetDateTime()
{
     throw new Exception();
}

2 - Вызовите вашу функцию в рамках отношения с другой таблицей:

from t in _dbContext.Customer 
select new { period = XDbContext.GetDateTime() };

Но мне нужно сделать это, используяфункционировать независимо, как мы можем сделать это в запросе SQL.

Буду очень признателен за любую помощь или полезный совет.

1 Ответ

0 голосов
/ 13 июня 2018

Чтение документации EF Core. Я нашел способ сделать это так, как хотел.Похоже, невозможно сопоставить функцию для использования прямо из dbcontext, но EF дает вам соединение, и вы можете использовать его в качестве читателя ADO.NET.Поэтому, создавая функцию внутри XDbContext, я могу использовать ее самым простым способом.

public class XDbContext : DbContext
{
    //MAPPED OBJECTS
    //....
    //....


    public XDbContext(DbContextOptions<XDbContext> options)
            : base(options) { }

    public string f_MyFunction()
    {
        var fResult = "";

        var conn = this.Database.GetDbConnection();

        conn.Open();

        using (var cmd = conn.CreateCommand())
        {
            string query = "SELECT DBO.MyFunction()";

            cmd.CommandText = query;

            DbDataReader reader = cmd.ExecuteReader();

            if (reader.HasRows)
            {
                reader.Read();
                fResult = reader.GetString(0);
            }
        }

        return fResult ;
    }
}

[Это всего лишь тест, я собираюсь реализовать функции лучше!]

Еслиу кого-то есть лучший вариант, пожалуйста, дайте мне знать.Я был бы очень признателен, чтобы узнать больше о возможностях EF Core в этой области.

...