猿问

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

我在 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”)不能为空。我该如何处理?


白衣染霜花
浏览 105回答 1
1回答

慕工程0101907

eventDate永远不会为空,因为正如您所说,它不可为空。您要检查的可空对象是EndEvents(因为您正在对该实体进行左连接)。您可以在此处使用null 条件运算符语法:EndEvents?.eventDate ?? DateTime.Now在为 nullDateTime.Now的情况下,这将落入右侧 ( )。EndEvents
随时随地看视频慕课网APP
我要回答