Как сопоставить табличную функцию с типом запроса в EF Core 2.1 - PullRequest
0 голосов
/ 26 июня 2018

У меня есть табличная функция на SQL Server

CREATE FUNCTION [dbo].[FStatusDepo] 
(   
    @ProvozID int, @ZonaID int NULL, @minutesWarning int
)
RETURNS TABLE 
AS
RETURN 
(
SELECT 
      q.[DepoID]
      ,SUM(CASE WHEN v.Vjezd IS NOT NULL AND datediff(mi, v.Vjezd, GETDATE())>@minutesWarning THEN 1 ELSE 0 END)  AS VjezduPoLhute
      ,SUM(CASE WHEN v.Vjezd IS NOT NULL AND datediff(mi, v.Vjezd, GETDATE())<=@minutesWarning THEN 1 ELSE 0 END)  AS VjezduVLhute
  FROM 
  ...

У меня новый проект с ASP.NET Core 2.1 и EF Core 2.1.

Я прочитал , что я могу определить новый тип Query в DbContext:

public class  StatusDepo
{
    public int DepoID { get; set; }
    public int VjezduPoLhute { get; set; }
    public int VjezduVLhute { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
            .Query<StatusDepo>().ToView("FStatusDepo");

Когда я смотрю на пример:

https://github.com/aspnet/EntityFrameworkCore/blob/dev/samples/QueryTypes/Program.cs

Я вижу, что мне, вероятно, также следует добавить эту строку в DbContext:

    public DbQuery<StatusDepo> StatusDepos { get; set; }

Тогда я могу выполнить:

   using (DixieContext db = new DixieContext())
    {
        var listStatusDepo = 
              db.StatusDepos.FromSql("SELECT * FROM [dbo].[FStatusDepo] (1, 1, 20)").ToList();
    }  

Это работает нормально, но строка:

    modelBuilder.Query<StatusDepo>().ToView("FStatusDepo")

вообще не имеет смысла, есть ли другая конструкция для параметризованных представлений или я должен просто удалить строку и использовать только FromSql?

1 Ответ

0 голосов
/ 26 июня 2018

есть ли другие конструкции для параметризованных представлений или я должен просто удалить строку и использовать только FromSql?

Да. Вы должны удалить modelBuilder.Query<StatusDepo>().ToView("FStatusDepo"). Здесь ничего не происходит, потому что вы не отображаете свой класс StatusDepo в SQL VIew, но используете функцию SQL, которая возвращает таблицу.

EF Core ToView() метод предназначен для сопоставления класса представлению SQL (и настройки свойства сопоставления со столбцами, если необходимо), поэтому вам не нужно будет писать свой SQL, потому что EF знает, как его сгенерировать.

В вашем случае достаточно кода ниже:

using (DixieContext db = new DixieContext())
{
    var listStatusDepo = db.StatusDepos.FromSql("SELECT * FROM [dbo].[FStatusDepo] (1, 1, 20)").ToList();
}  
...