Linq,左加入和日期

时间:2010-01-20 00:23:44

标签: linq linq-to-sql date left-join defaultifempty

所以我的情况是我有一个linq-to-sql模型,它不允许我的一个表中的日期为空。这是预期的,因为数据库不允许该字段中的空值。我的问题是,当我尝试使用此模型编写Linq查询时,我不能再对该表进行左连接,因为日期不是'可空'字段,因此我无法将其与“Nothing”进行比较。

实施例: 有一个电影表,{ID,MovieTitle}和一个Showings表,{ID,MovieID,ShowingTime,Location}

现在我正在尝试写一个声明,它将返回所有那些没有放映的电影。在T.SQL中,这看起来像:

Select m.*
From Movies m Left Join Showings s On m.ID = s.MovieID
Where s.ShowingTime is Null

现在在这种情况下,我可以在“位置”字段上测试Null,但这不是我现实中的(仅仅是一个简化的例子)。我所拥有的只是非空日期。

我正在写Linq:

From m In dbContext.Movies _
Group Join s In Showings on m.ID Equals s.MovieID into MovieShowings = Group _
From ms In MovieShowings.DefaultIfEmpty _
Where ms.ShowingTime is Nothing _
Select ms

但是我收到错误

'Is'运算符不接受'Date'类型的操作数。操作数必须是引用或可空类型。

这有什么办法吗?模型是正确的,Showings:ShowTime表中永远不应该为null。但是如果你做一个左连接,并且没有特定电影的放映时间,那么ShowTime对于那部电影应该没什么......

感谢大家的帮助。

2 个答案:

答案 0 :(得分:2)

使用左连接并不能帮到你。由于右侧表中永远不会有任何结果,您也可以只检索左侧表,只检索左侧表。这是一个简单的“不在”/“不存在”的查询:

From m in dbContext.Movies _
Where Not dbContext.Showings.Any(Function(s) s.MovieID = m.MovieID) _
Select m

答案 1 :(得分:0)

如果Showings表中没有记录,则查询中的整个对象应该没有任何内容。在这种情况下,日期永远不会发挥作用。左连接将像这样写入,仅选择缺少显示的电影

Dim query = From m In dbContext.Movies _
            Group Join s In dbContext.Showing On m.ID Equals s.MovieID Into g = Group _
            From item In g.DefaultIfEmpty() _
            Where item Is Nothing _
            Select m