EF Core服务器评估存储过程结果

时间:2018-04-15 11:35:07

标签: c# sql-server entity-framework entity-framework-core

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语句,有没有办法强制它被识别出来?

感谢。

1 个答案:

答案 0 :(得分:0)

我使用的是表值函数,它是可组合的,因为EFC知道它是只读的。