EF Core支持执行存储过程并将结果映射到实体(现有实体或专门为存储过程创建的实体)。
我已阅读有关此主题的许多问题,例如https://github.com/aspnet/EntityFrameworkCore/issues/1862 https://github.com/aspnet/EntityFrameworkCore/issues/245。
我认为#1862会为只执行SELECT
操作的存储过程启用服务器评估。
然而,似乎我的代码导致2次调用数据库。有没有办法通过一次调用数据库来执行以下代码?
var customIdsQuery = _dbContext.Set<CustomId>()
.FromSql($"dbo.GetCustomIDs {username}").AsNoTracking();
var eventsQuery = _dbContext.Event.Where(ev => ev.User.Username == username)
.Join(customIdsQuery, ev => rev.CustomId, cid=> cid.Id, (ev, cid) => ev).AsNoTracking();
var events = eventsQuery.ToList(); // 2 database calls
模型构建器看起来像这样:
modelBuilder.Entity<CustomId>(); // For the stored procedure
modelBuilder.Entity<Event>(entity => // Key is defined as attribute on the model
{
entity.HasOne(d => d.Meeting)
.WithMany(p => p.Event)
.HasForeignKey(d => d.MeetingId);
entity.HasOne(d => d.User)
.WithMany(p => p.Event)
.HasForeignKey(d => d.UserId);
});
我是否遗漏了一些明显的东西,以便能够在SQL服务器上评估整个查询?从文档(https://docs.microsoft.com/en-us/ef/core/querying/raw-sql):
传递给此方法的SELECT语句通常应该是可组合的:如果EF Core需要评估服务器上的其他查询运算符(例如,转换在FromSql之后应用的LINQ运算符),则提供的SQL将被视为子查询
我的存储过程实际上就像一个SELECT
语句,有没有办法强制它被识别出来?
感谢。
答案 0 :(得分:0)
我使用的是表值函数,它是可组合的,因为EFC知道它是只读的。