【问题标题】:Entity Framework include with where clause实体框架包含 where 子句
【发布时间】:2016-04-13 18:45:10
【问题描述】:

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

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

这是电影类:

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

我知道这个功能不起作用,但希望它能显示我正在尝试做的事情。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这会非常非常慢。如果您将函数应用于要搜索的列,您的数据库将无法使用索引。
    • 谢谢..它现在正在工作。我只在数据库中显示了 12 月 1 日和 2 日的带有 DateTime 的元组,但是每当我选择 12 月的任何日期时,我都会取出所有的电影 tubles。当我选择 12 月 1 日或 2 日时,它应该只会播放一些电影
    【解决方案2】:

    你应该可以使用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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-31
        • 2011-10-21
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多