当 DateTime 有值时,为什么可为 nullable DateTime HasValue return false?

Why does nullable DateTime HasValue return false when the DateTime has a value?

以下SQL语句returns 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服务器中,STATUS_IDintJOURNAL_ENTRY_NUMBERvarchar(30)BILLING_PROCESS_DATEdatetime接受空值。

在C#中,在我的TestRequestInvoiceclass中,STATUS_ID是一个int,JOURNAL_ENTRY_NUMBER是一个字符串,BILLING_PROCESS_DATE是一个DateTime?(可为空的日期时间)

使用 Dapper,我将 v_TEST_REQUEST_INVOICE 中相关列的 select 的结果(没有 WHERE 子句)拉入 List<TestRequestInvoice>.

使用 VS 调试器我可以看到列表中有 1893 个成员。然后我使用 LINQ 尝试将列表限制为仅匹配 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 

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