【问题标题】:Why does nullable DateTime HasValue return false when the DateTime has a value? [closed]为什么当 DateTime 有值时,可为空的 DateTime HasValue 返回 false? [关闭]
【发布时间】:2021-09-23 14:49:39
【问题描述】:

以下 SQL 语句返回 844 行:

SELECT <column list> 
FROM v_TEST_REQUEST_INVOICE 
WHERE ARCHIVE_DATE IS NULL 
AND STATUS_ID = 8
AND JOURNAL_ENTRY_NUMBER IS NULL 
AND BILLING_PROCESS_DATE IS NOT NULL

在 SQL Server 中,STATUS_IDintJOURNAL_ENTRY_NUMBERvarchar(30)BILLING_PROCESS_DATEdatetime,它接受空值。

在 C# 中,在我的 TestRequestInvoice 类中,STATUS_ID 是一个 int,JOURNAL_ENTRY_NUMBER 是一个字符串,BILLING_PROCESS_DATE 是一个 DateTime?(可为空的 DateTime)

使用 Dapper,我将v_TEST_REQUEST_INVOICE(不带WHERE 子句)中相关列的选择结果提取到List&lt;TestRequestInvoice&gt;

使用 VS 调试器我可以看到列表中有 1893 个成员。然后我使用 LINQ 尝试将 List 限制为仅匹配 where 子句的那些成员,预计保留 844 个成员。

test_request_invoices = test_request_invoices.Where(tri => tri.STATUS_ID == 8 && tri.JOURNAL_ENTRY_NUMBER == null && tri.BILLING_PROCESS_DATE.HasValue).ToList();

但结果是一个空列表。为什么???我做错了什么?

我已经在Checking to see if a DateTime variable has had a value assigned看答案了

更新:这是 Dapper 生成的 SQL 代码:

SELECT 
[TEST_REQUEST_ID], 
[SCHEDULE_ITEM_ID], 
[STUDENT_ID], 
[STUDENT_LFNAME], 
[BUDGET_ID], 
[MNEMONIC], 
[COORDINATOR_ID], 
[PERIOD_ID], 
[PERIOD_NAME], 
[TEST_TYPE_ID], 
[STATUS_ID], 
[STATUS], 
[STATUS_DATE], 
[CANCELLATION_STATUS_ID], 
[CANCELLATION_STATUS], 
[TEST_COMPLETED], 
[RAW_SCORE], 
[CONVERTED_SCORE], 
[FINAL_ID], 
[TEST_RESULT_APPROVAL_BY], 
[TEST_RESULT_APPROVAL_DATE], 
[LATE_CANCELLATION_COMMENTS], 
[RESULTS_REPORTED_BY], 
[RESULTS_REPORTED_DATE], 
[SC_POSTED_SCORE_NOTIFIED], 
[LIONPATH_UPLOAD_PREP], 
[INVOICE_ACCOUNT], 
[INVOICE_FUND], 
[INVOICE_OBJECT_CODE], 
[INVOICE_COST_CENTER], 
[SIMBA_COST_CENTER], 
[SIMBA_INTERNAL_ORDER], 
[AMOUNT], 
[INVOICE_AMOUNT_REASON], 
[JOURNAL_ENTRY_NUMBER], 
[AA_INVOICE_NOTIFIED], 
[INVOICING_AA], 
[INVOICING_AA_EMAIL], 
[INVOICING_AA_LFNAME], 
[INVOICING_AA_PHONE], 
[ADD_BY], 
[ADD_DATE], 
[CHANGE_BY], 
[CHANGE_DATE], 
[ARCHIVE_BY], 
[ARCHIVE_DATE] 
FROM v_TEST_REQUEST_INVOICE 
WHERE ARCHIVE_DATE IS NULL 
ORDER BY ADD_DATE 

【问题讨论】:

  • 如何比较查询?
  • 我不明白你的问题@SvyatoslavDanyliv——你能详细说明一下吗?而且我不确定你为什么对我的问题投反对票(如果是你投反对票的话)
  • Nullable&lt;DateTime&gt;(或DateTime?)在基础数据类型显式不可为空时使用。因此.Value总是 有一个值,您必须检查.HasValue 以了解存储的值是否有任何意义!
  • EF 生成 SQL,只需将预期的 SQL 与生成的 SQL 进行比较。使用生成的 SQL 更新问题也更好。
  • @Immersive 我很困惑。我认为这正是我正在做的。谢谢。

标签: c# sql-server linq dapper


【解决方案1】:

您的SELECT 子句似乎没有BILLING_PROCESS_DATE 的条目,因此即使您只为具有非空日期的行选择数据,您也不会得到实际日期结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多