繁体   English   中英

实体框架包含with where子句

[英]Entity Framework include with where clause

我目前正在为学校项目开发电影院预订系统,但遇到了问题。

我有一个电影模型,其中包含一个放映模型的列表(观看电影的日期和时间)。 我需要获取在特定日期显示的所有电影对象,以及仅包含日期等于特定日期的Show对象的列表。 我尝试了各种方法来实体完成此操作,但似乎无法使其正常工作。

这是电影课:

[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 date)方法:

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;
    }
}

我知道此功能无法正常工作,但希望它能显示我要执行的操作。

我认为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();

更新:

阅读DbFunctions.TruncateTime的评论后,我做了一些研究,使用DbFunctions.TruncateTime可能会影响性能。 您可以在这篇文章中找到详细的解释。

遵循@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();

您应该可以使用任何

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;
    }
}

我的要求很好地使用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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM