为了账号安全,请及时绑定邮箱和手机立即绑定

C#、ASP.Net Core 和 Linq:处理空日期

C#、ASP.Net Core 和 Linq:处理空日期

C#
白衣染霜花 2022-12-24 12:27:01
我在 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


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 72 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号