我在 Visual Studio 2019、C#、ASP.Net Core 中制作多連接查詢時遇到問題。我有兩張桌子: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)登錄/注銷等成對事件被放入事件表中。表的INSERT 觸發器events處理表的管理sessions。對于這個問題,假設會話表可能如下所示: id | start_id | end_id----+----------+-------- 1 | 1 | null 2 | 2 | 3events: 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 endDateFROM sessionsJOIN events StartEvents ON sessions.start_id = StartEvents.idLEFT JOIN events EndEvents ON sessions.end_id = EndEvents.idWHERE 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 } ).ToList();有人告訴我“'??'的左操作數” 應該是引用或可為空的類型”。問題是基礎字段(事件中的“eventDate”)不能為空。我該如何處理?
1 回答

慕工程0101907
TA貢獻1887條經驗 獲得超5個贊
eventDate
永遠不會為空,因為正如您所說,它不可為空。您要檢查的可空對象是EndEvents
(因為您正在對該實體進行左連接)。您可以在此處使用null 條件運算符語法:
EndEvents?.eventDate ?? DateTime.Now
在為 nullDateTime.Now
的情況下,這將落入右側 ( )。EndEvents
- 1 回答
- 0 關注
- 83 瀏覽
添加回答
舉報
0/150
提交
取消