实体框架代码优先执行标量值函数

本文关键字:标量 函数 执行 框架 代码 实体 | 更新日期: 2023-09-27 18:06:25

如何首先使用代码执行标量函数?下面是我所尝试的,但只有查询本身被返回,而不是返回值。

using (var dbContext = new FTTRContext())
        {
            queryResult =
                dbContext.Database.SqlQuery<string>("SELECT [dbo].[ufnGetTotalUsers] (GETDATE())").ToString();
        }

实体框架代码优先执行标量值函数

SqlQuery返回DbRawSqlQuery的实例。这个类是一个可枚举的,它希望你通过标准LINQ操作符或foreach等来枚举它。此对象上的.ToString()只是返回将被执行的查询。要得到你想要的结果,使用.Single().SingleAsync()

queryResult = dbContext.Database
    .SqlQuery<string>("SELECT [dbo].[ufnGetTotalUsers] (GETDATE())")
    .Single();

这将返回您正在查找的标量字符串结果。

也就是说,您的查询看起来像无效的SQL。你只是想从SQL Server获取日期吗?如果是,查询应该是SELECT GETDATE()。一旦您这样做,您可能必须使用.SqlQuery<DateTime>(),因为该值的类型不是字符串。

关于EF Core的最新答案将在这里描述

TL;博士:创建一个无密钥实体并使用.FromSqlRaw。注意:在查询中命名列!

可以省略存储过程。在下面的例子中,我直接使用了一个序列:

实体:

    public class MySequence
    {
        public int MyValue { get; set; }
    }

Db上下文:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<MySequence>().HasNoKey();
    }

用法:

public static IntSequence GetNextIntSequenceSynchronous(this DbContext context)
    {
        return context.MySequence
                .FromSqlRaw("SELECT NEXT VALUE FOR MyDbSequence AS MyValue")
                .AsEnumerable().First();
    }