我在 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 | 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
}
).ToList();
有人告诉我“'??'的左操作数” 应该是引用或可为空的类型”。问题是基础字段(事件中的“eventDate”)不能为空。我该如何处理?
白衣染霜花
慕工程0101907
随时随地看视频慕课网APP
相关分类