我目前正在为学校项目制作影院预订系统并遇到问题。
我有一个电影模型,其中包含一个节目模型列表(观看电影的日期和时间)。我需要获取在特定日期显示的所有电影对象,其中列表仅包含日期等于特定日期的Show对象。我已尝试过多种方法在实体中完成它但似乎无法使其工作。
这是Movie课程:
[DataContract]
public class Movie
{
[Key, Required, DataMember]
public Guid Id { get; set; }
[Required, DataMember]
public string Name { get; set; }
[Required, DataMember]
public string Info { get; set; }
[Required, DataMember]
public DateTime Premiere { get; set; }
[Required, DataMember]
public MovieType Type { get; set; }
[DataMember]
public ICollection<Show> Shows { get; set; }
[DataMember]
public string IMDBID { get; set; }
}
public enum MovieType
{
Movie2D = 0,
Movie3D = 1,
KidsMovie = 2
}
这是Show类:
[DataContract]
public class Show
{
[Key, Required, DataMember]
public Guid Id { get; set; }
[Required, DataMember]
public Guid MovieId { get; set; }
[Required, DataMember]
public Guid ScreenId { get; set; }
[Required, DataMember]
public DateTime DateTime { get; set; }
[Required, DataMember]
public ShowType Type { get; set; }
[DataMember]
public Screen Screen { get; set; }
[DataMember]
public Movie Movie { get; set; }
}
public enum ShowType
{
Standard = 0,
Premiere = 1,
}
以下是GetMovies(DateTime日期)方法:
public List<Movie> GetMovies(DateTime date)
{
using (EntityContext db = new EntityContext())
{
List<Movie> movieList = db.Movies
.Include("Show")
.Where(x => x.Shows.Where(x => x.DateTime.Date == date.Date)).ToList();
return movieList;
}
}
我知道这个功能不起作用,但希望它会显示我想要做的事情。
答案 0 :(得分:4)
我认为Linq to Entities不支持DateTime.Date
。您可以使用DbFunctions.TruncateTime
静态方法:
var justDate= date.Date;
var movieList=db.Movies.Include(x=>x.Shows)
.Where(x => x.Shows.Any(x => DbFunctions.TruncateTime(x.DateTime) == justDate))
.ToList();
在阅读@ Jonathan的评论后,我做了一些研究,使用DbFunctions.TruncateTime
确实会影响性能。您可以在此post中找到详细说明。
遵循@JonathanAllen和@MattJohnson的相同想法,如果您执行范围查询,则可以避免使用该函数,首先从date
参数截断时间:
var startDate= date.Date;
var endDate= startDate.AddDays(1);
var movieList=db.Movies.Include(x=>x.Shows)
.Where(x => x.Shows.Any(x =>x.DateTime >= startDate && x.DateTime < endDate)
.ToList();
答案 1 :(得分:1)
您应该可以使用Any
public List<Movie> GetMovies(DateTime date)
{
using (EntityContext db = new EntityContext())
{
List<Movie> movieList = db.Movies.Include("Show")
.Where(x => x.Shows.Any(x => x.DateTime.Date == date.Date));
return movieList;
}
}
答案 2 :(得分:0)
我的请求很好地使用了All()方法。
model.ReferenceList = db.JournalCardReference.OrderBy(a => a.orderF)
.Include(x => x.JournalCardField)
.Where(x => x.JournalCardField
.All(f => f.deleted == null || f.deleted != true)).ToList();