如何查找没有具有特定属性的子对象的所有父对象?

时间:2015-02-01 19:03:14

标签: c# linq entity-framework lambda

我有以下实体:追踪,排名

每个跟踪可以有0个或更多等级。每个Rank都有一个名为RankDateTime的属性。

我需要找到今天没有排名的所有跟踪。

这就是我一直在尝试的:

尝试1

var myTrackings = from track in DBContext.Trackings
            join r in DBContext.Ranks on track.TrackingId equals r.TrackingId
            where r.RankDateTime < DateTime.Today select track;

尝试2

var myTrackings3 =
DBContext.Trackings.Where(t => t.Ranks.Any
(r => r.RankDateTime.Date != DateTime.Today.Date));

我在这里有点困惑,我的直觉告诉我,我在这里做错了。

查询此信息的正确方法是什么?

提前致谢。

2 个答案:

答案 0 :(得分:1)

假设将来没有RankDateTimes,这应该可行

var myTrackings3 = DBContext.Trackings.Where
    (t => !t.Ranks.Any(r => r.RankDateTime.Date >= DateTime.Today.Date));

答案 1 :(得分:0)

您正在寻找所有排名不适用于今天的跟踪:

var today = DateTime.Today;
var myTrackings3 = DBContext.Trackings
                            .Where(t => t.Ranks.All(r => r.RankDateTime < today));

或者,如果有未来的排名:

var today = DateTime.Today;
var tomorrow = today.AddDays(1);
var myTrackings3 = DBContext.Trackings
                            .Where(t => t.Ranks.All(r => r.RankDateTime < today
                                     && t.Ranks.All(r => r.RankDateTime >= tomorrow
                              ));

我故意避免使用r.RankDateTime.Date,因为这会使表达式不是 sargable ,即它会禁用RankDateTime上的任何索引。