实体框架包含where子句

时间:2016-04-13 18:45:10

标签: c# asp.net asp.net-mvc entity-framework

我目前正在为学校项目制作影院预订系统并遇到问题。

我有一个电影模型,其中包含一个节目模型列表(观看电影的日期和时间)。我需要获取在特定日期显示的所有电影对象,其中列表仅包含日期等于特定日期的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;
    }
}

我知道这个功能不起作用,但希望它会显示我想要做的事情。

3 个答案:

答案 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();