使用 EF core 2.1 调用 DbFunction

问题描述 投票:0回答:1

我尝试调用存储在数据库中的标量函数。 这是我的代码:

public class PronosticDbContext : DbContext
{
    public PronosticDbContext(DbContextOptions<PronosticDbContext> options) : base(options)
    {

    }

    [DbFunction(FunctionName = "GetPlayerPointsForDay", Schema = "dbo")]
    public static int GetPlayerPointsForDay(int dayId, int userId) => throw new NotSupportedException();    
}

电话:

private IQueryable<PlayerRankingData> GetPlayerRanking(int? dayId)
{
    return Context.Days.Where(x => x.Id == dayId.Value).Select(x => new PlayerRankingData
    {
        // Some properties
        Users = x.Season.Users.Select(us => new PlayerRankingData.User
        {
            // Other properties
            Last = PronosticDbContext.GetPlayerPointsForDay(x.Id, us.User.Id),
            // Others again
        }).OrderByDescending(u => u.Points).ThenByDescending(u => u.Last).ThenBy(u => u.Login)
    });
}

我不明白为什么,但我总是去

NotSupportedException
,我的标量函数从未被调用。为什么我错过了?

我也尝试过这样,但结果相同...

modelBuilder
    .HasDbFunction(typeof(PronosticDbContext).GetMethod(nameof(GetPlayerPointsForDay)))
    .HasSchema("dbo")
    .HasName(nameof(GetPlayerPointsForDay));
c# ef-core-2.1 dbfunctions
1个回答
6
投票

好的,我明白了。

问题是你不能直接调用标量函数(我不知道为什么),它必须封装在 linq 查询中,如下所示:

Last = Context.Users.Select(u => PronosticDbContext.GetPlayerPointsForDay(x.Id, us.User.Id)).FirstOrDefault()

仅此而已。无需在 DbContext 中声明,这就足够了:

[DbFunction]
public static int? GetPlayerPointsForDay(int dayId, int userId) => throw new NotSupportedException();
© www.soinside.com 2019 - 2024. All rights reserved.