[英]C#, ASP.Net Core and Linq: dealing with null dates
我在Visual Studio 2019,C#,ASP.Net核心中編寫多聯接查詢時遇到麻煩。
我有兩個表:
sessions(
id int primary key,
start_id int not null, // foreign key to "start event" event.id
end_id int // foreign key to "end event" event.id
)
events(
id int primary key,
username varchar(32) not null,
deviceName varchar(64) not null,
eventName varchar(8) not null,
eventDate datetime not null
)
成對的事件(如登錄/注銷)被放入事件表中。 events
表的INSERT上的觸發器處理sessions
表的管理。 對於這個問題,假設會話表如下所示:
id | start_id | end_id
----+----------+--------
1 | 1 | null
2 | 2 | 3
events:
id | userName | deviceName | eventName | eventDate
----+----------+------------+-----------+-----------
1 | alice | moose | login | 2019-03-11 14:02:54
2 | bob | juno | login | 2019-03-11 15:11:08
3 | bob | juno | logout | 2019-03-11 17:18:22
在SSMS中,我可以將查詢編寫為:
SELECT
sessions.id,
StartEvents.userName,
StartEvents.deviceName,
StartEvents.eventDate as startDate,
ISNULL(EndEvents.eventDate, GETDATE()) as endDate
FROM sessions
JOIN events StartEvents
ON sessions.start_id = StartEvents.id
LEFT JOIN events EndEvents
ON sessions.end_id = EndEvents.id
WHERE StartEvents.eventDate >= @myStart
AND ISNULL(EndEvents.eventDate, GETDATE()) <= @myEnd
我已經在C#中嘗試了以下方法:
var result = (
from sessions in db.Sessions
join StartEvents in db.Events
on sessions.Start_id equals StartEvents.Id
join EndEventsTmp in db.Events
on sessions.End_id equals EndEventsTmp.Id into EndEventsTmp2
from EndEvents in EndEventsTmp2.DefaultIfEmpty()
where StartEvents.Machine.Trim().ToUpper().Equals(machine.Trim().ToUpper())
& StartEvents.eventDate >= myStart
& (EndEvents.eventDate ?? DateTime.Now) <= myEnd
orderby StartEvents.Date
select new UserTrackingToFullCalendar {
Id = StartEvents.Id,
User = StartEvents.userName,
Device = StartEvents.deviceName.ToUpper(),
Start = StartEvents.eventDate,
End = EndEvents.eventDate ?? DateTime.Now
}
).ToList();
有人告訴我,“'?”的左操作數 應該是引用或可為空的類型”。 問題在於基礎字段(事件中的“ eventDate”)不能為null。 我該如何處理?
如您所說,由於eventDate
不可為空,因此它永遠不會為null。 您要檢查的可為空對象是EndEvents
(因為您正在對該實體執行左連接)。 您可以在此處使用空條件運算符語法:
EndEvents?.eventDate ?? DateTime.Now
如果EndEvents
為null,它將落在右側( DateTime.Now
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.