0

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

示例:有一个电影表 {ID,MovieTitle} 和一个放映表 {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

但是我收到一条错误消息

“是”运算符不接受“日期”类型的操作数。操作数必须是引用或可为空的类型。

有没有办法解决?模型是正确的,Showings:ShowTime 表中不应该有空值。但是如果你做了一个左连接,并且没有特定电影的放映时间,那么 ShowTime 应该是那部电影的无...

感谢大家的帮助。

4

2 回答 2

2

在这里使用左连接并不能真正帮助您。由于右侧表格中永远不会有任何结果,因此您不妨只检索左侧表格并且只检索左侧表格。这是一个简单的“不在”/“不存在”查询:

From m in dbContext.Movies _
Where Not dbContext.Showings.Any(Function(s) s.MovieID = m.MovieID) _
Select m
于 2010-01-20T00:40:38.723 回答
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
于 2010-06-02T14:13:12.697 回答