EF Core 2数据库首先 - 映射自定义函数

时间:2018-06-13 10:10:56

标签: asp.net-core ef-code-first ef-core-2.0 custom-function

我首先使用带有SQL Server 2017的数据库的EF Core 2.0,它适用于我的表和视图。但是,我有一个问题是映射我在数据库中的现有函数。

功能:(示例)

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 :(得分:0)

阅读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的可能性。