Как я могу использовать Первый подход Entity Framework Code для выполнения запросов и группировки результатов моих данных из SQL Server для получения результатов, показанных на этом изображении:
Я попытался написать код, как показано ниже, но Entity Framework не нравится, и он выдает некоторые исключения:
жалуясь, что читатель данных не может найти некоторые столбцы, соответствующие столбцам, которые я указал в следующем классе сущностей, который я создал в этом классе.
Я думал, что приведенные ниже запросы T-SQL не поддерживаются вEntity Framework!
SELECT CASE WHEN GROUPING && GROUP BY
................................ .................................................. ...................
Ниже приведен класс ContractBOQ
и класс контекста MyFirstDBContext
Table("ContractBOQ")] // map to an existing Table called ContractBOQ
public class ContractBOQ
{
[Key]
[Column("SN")]
public int SN { get; set; }
[Required]
[Column("Item Code")]
public string Item_Code { get; set; }
[Required]
[Column("Description")]
public String Description { get; set; }
[Required]
[Column("Unit")]
public string Unit { get; set; }
[Required]
[Column("Quantity")]
public decimal Quantity { get; set; }
[Required]
[Column("Approaved Rate")]
public decimal Approaved_Rate { get; set; }
[Required]
[Column("Contract Rate")]
public decimal Contract_Rate { get; set; }
[Required]
[Column("Approved Amount")]
public decimal Approved_Amount { get; set; }
[Required]
[Column("Contract Amount")]
public decimal Contract_Amount { get; set; }
[Required]
[Column("BOQ Part")]
public string BOQ_Part { get; set; }
[Required]
[Column("Contract ID")]
public string Contract_ID { get; set; }
[Required]
[Column("Road Name")]
public string Road_Name { get; set; }
[Required]
[Column("Road Code")]
public string Road_Code { get; set; }
}
public class MyFirstDBContext : DbContext
{
public virtual DbSet<ContractBOQ> ContractBOQ { get; set; }
}
Я преобразовал T-SQL ниже в хранимых процедурах и я назвал его GetAllContracts
, чтобы я мог выполнить его как Query, передав его методу Context.Database.Sqlquery ("GetAllContracts")
класса Context
.
Ниже представлена хранимая процедура GetAllContracts , которую я создал:
CREATE OR ALTER PROC [dbo].[GetAllContracts] AS BEGIN
Select case when grouping([SN])=1 THEN 'Sub-Total:'
else CAST( SN as nvarchar) end SN,
case when grouping ([Item Code])=1 THEN [Road Name]
else [Item Code] end as [Item Code],
case when grouping ([Description])=1 THEN [BOQ Part]
else [Description] end as [Description],
case when grouping ([Unit])=1 THEN '* * *' ELSE [Unit]
end as [Unit],
[Quantity],[Approaved Rate] ,[Contract Rate],
sum([Approved Amount]) as[Approved Amount]
From [MyFirstDB].[dbo].[ContractBOQ]
where [Contract ID]='RH/NTC/2019-2020/Q/01'
group by grouping sets
((SN,[Item Code],[Description],[Unit] ,[Quantity] ,
[Approaved Rate] ,[Contract Rate],[Approved Amount],
[Contract Amount],
[BOQ Part],[Contract ID],[Road Name],[Road Code]),
([Road Name],[BOQ Part]),([Road Name]),()) ORDER BY
GROUPING([Road Name])
END
Затем я создал подпрограмму с именем LoadGrid () , которую я вызываю во время Form1_Load () событие формы 'Form1'
private void LoadGrid()
{
Application.DoEvents();
Cursor.Current = Cursors.WaitCursor;
using (var db = new MyFirstDBContext())
{
var data = db.ContractBOQ.SqlQuery("GetAllContracts");
dgvData.DataSource = data.ToList();
dgvData.Refresh();
dgvData.ReadOnly = true;
}
Cursor.Current = Cursors.Default;
}
Это столбцы существующей таблицы с именем ContractBOQ в базе данных:
При запуске я получаю эту ошибку:
Любая помощь, чтобы исправить эту ошибку и заставить ее работать ..