当 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_ID
是int
,JOURNAL_ENTRY_NUMBER
是varchar(30)
,BILLING_PROCESS_DATE
是datetime
接受空值。
在C#中,在我的TestRequestInvoice
class中,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
的条目,因此即使您只为具有非空日期的行选择数据,您也没有在结果中返回实际日期。
以下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_ID
是int
,JOURNAL_ENTRY_NUMBER
是varchar(30)
,BILLING_PROCESS_DATE
是datetime
接受空值。
在C#中,在我的TestRequestInvoice
class中,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
的条目,因此即使您只为具有非空日期的行选择数据,您也没有在结果中返回实际日期。