Вызов DbFunction с EF core 2.1 - PullRequest
       31

Вызов DbFunction с EF core 2.1

0 голосов
/ 12 ноября 2018

Я пытаюсь вызвать скалярную функцию, хранящуюся в моей БД.Вот мой код:

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));

1 Ответ

0 голосов
/ 13 ноября 2018

Хорошо, я понял.

Дело в том, что вы не можете вызывать скалярную функцию напрямую (я не знаю почему), она должна быть заключена в запрос 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();
...