我在 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 关注
- 72 浏览
添加回答
举报
0/150
提交
取消