【发布时间】:2020-07-22 18:07:40
【问题描述】:
我有一个问题,我在存储过程中将一列定义为 varchar,但是当我将它添加到我的 C# 程序时,EntityFramework 使用 DateTime 可为空的原始字段类型。我认为问题可能出在第二个 select 语句中,因为我使用相同的字段名称但不是 100% 确定。
存储过程:
SELECT
1 AS [SORT]
,CONVERT(VARCHAR, t1.RecDate, 120) AS [RecDate]
,t1.Program AS [Program]
,t1.Currency AS [CURRENCY]
,t1.SupplierName AS [SupplierName]
,t1.SupplierAccount AS [SupplierAccount]
,t1.RecStatus AS [RecStatus]
,t4.Type AS [TYPE]
,CONVERT(VARCHAR, t1.Date, 120) AS [PiDate]
,CONVERT(VARCHAR, t1.DiscountedDate, 120) AS [DiscountedDate]
,CONVERT(VARCHAR, t1.DueDate, 120) AS [DueDate]
,t1.PaymentAmount AS [Payment]
FROM orb_RootRecords t1
LEFT JOIN orb_SupplierRecords t3 on t3.OrbianAccountId = t1.SupplierAccount
LEFT JOIN orb_AccountType t4 on t4.Id = t3.AccountTypeId
WHERE FLOOR(CAST(t1.RecDate as float)) = FLOOR(CAST(@runDate as float))
--ORDER BY [SORT], [Program] ,[CURRENCY] ,[RecDate] ,[SupplierName] ,[SupplierAccount],[RecStatus] ,[TYPE],[PiDate] ,[DiscountedDate] ,[Payment]
UNION
SELECT 2 AS [SORT], [RecDate], Program AS [Program], [CURRENCY], null AS [SupplierName], null AS [SupplierAccount], null AS [RecStatus], null AS [TYPE], null AS [PiDate], null AS [DiscountedDate], null AS [DueDate]
,SUM (PaymentAmount) AS [Payment]
FROM orb_RootRecords t2
where FLOOR(CAST(t2.RecDate as float)) = FLOOR(CAST(@runDate as float))
Group by [RecDate], [Program], [CURRENCY]
ORDER BY [RecDate], [Program], [CURRENCY], [Sort], [SupplierName], [SupplierAccount], [RecStatus], [TYPE], [PiDate], [DiscountedDate], [DueDate], [Payment]
EntityFramework 结果:
public partial class orb_rpt_reconciliation_report_Result
{
public int SORT { get; set; }
public Nullable<System.DateTime> RecDate { get; set; }
public string Program { get; set; }
public string CURRENCY { get; set; }
public string SupplierName { get; set; }
public string SupplierAccount { get; set; }
public string RecStatus { get; set; }
public string TYPE { get; set; }
public string PiDate { get; set; }
public string DiscountedDate { get; set; }
public string DueDate { get; set; }
public Nullable<decimal> Payment { get; set; }
}
我期待看到公共字符串 RecDate { get;放; } 而不是上面显示的内容。
【问题讨论】:
-
我认为你必须与你对待
RecDate的方式保持一致:要么总是转换为字符串,要么永远不要这样做。如果需要进行查询或比较“工作”,SQL Server 将更改数据类型。确保结果一致性的唯一方法是在你要求它做的事情上保持一致。 -
假设您总是希望 RecDate 是一个字符串,而不是将
CONVERT(VARCHAR, t2.RecDate, 120)放入您的UNION的第二个查询中?
标签: c# entity-framework stored-procedures