我有以下实体:追踪,排名
每个跟踪可以有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));
我在这里有点困惑,我的直觉告诉我,我在这里做错了。
查询此信息的正确方法是什么?
提前致谢。
答案 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
上的任何索引。