实体框架代码优先执行标量值函数
本文关键字:标量 函数 执行 框架 代码 实体 | 更新日期: 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();
}