【问题标题】:C# Entity Framework count all instances of an objectC# Entity Framework 计算对象的所有实例
【发布时间】:2017-12-02 10:29:47
【问题描述】:

我正在尝试计算Movie_Instance 的所有实例,这些实例在Movie 表中包含电影的外键。

这是我的代码:

var query = entities.Movie.Join(entities.Movie_Instance, 
                                movie2 => movie.ID_Movie,        
                                movie_instance => movie_instance.FK_ID_Movie,
                                (movie2, movie_instance) => new { Movi = movie, Movie_Instanc = movie_instance })
                    .Where(data => data.Movi.ID_Movie == data .Movie_Instanc.FK_ID_Movie 
                                   && data .Movi.ID_Movie == movie.ID_Movie)
                    .SelectMany(e => entities.Movie_Instance).Count();

我在运行时得到的是一个错误:

System.NotSupportedException: '无法创建'DBFilmy.Movie' 类型的常量值。此上下文仅支持原始类型或枚举类型

[编辑]

]1

Movie_instance 包含Movie 的实例。它使用外键 (FK_ID_Movie -> ID_Movie) 连接我有多个Movie 实例,每个实例都存储在Movie_Instance 中。我想计算我有多少个movie 实例(movieMovie 类型的对象)

这是我得到电影的地方:

var x = entities.Movie
                .Where(c => c.Title.Contains(_title)
                            && c.Director.Contains(_director)
                            && c.Category.Contains(_category));

foreach (var movie in x)
{
   ...
}

【问题讨论】:

    标签: c# sql entity-framework


    【解决方案1】:

    我找到了一个可行的解决方案:

    var query = entities.Movie.Join(entities.Movie_Instance,
                                s => s.ID_Movie,
                                c => c.FK_ID_Movie,
                                (s, c) => new {s, c}).Where(sc => sc.c.FK_ID_Movie == movie.ID_Movie).Select(sc => sc.s)
                            .Count();
    

    【讨论】:

      【解决方案2】:

      当您尝试在上下文中使用DbSet 加入本地(内存中)对象列表时,通常会发生异常。它告诉您(用相当神秘的语言)本地对象不能在 SQL 语句中转换为原始值。

      但是查看您的代码,我没有看到任何本地列表。 entities.Movieentities.Movie_Instance 都是 DbSets(除非你在你的上下文中做了一些意想不到的事情)所以我不太了解异常的起源。

      所有这些只有在代码中没有几个问题的情况下才有资格作为注释。

      • Where 子句的第一部分是完全多余的。加入已经匹配movie.ID_Moviemovie_instance.FK_ID_Movie,为什么还要再做一次?

      • Where 子句的第二部分 data.Movi.ID_Movie == movie.ID_Movie 也是多余的:data.Movimovie 是相同的实体。

      • 您根本不需要连接,因为您已经有了一个包含连接的导航属性:movie.Movie_Instance

      当您使用导航属性时,您的代码可以像这样简单:

      var query = entities.Movie
          .SelectMany(e => entities.Movie_Instance).Count();
      

      您会看到生成的 SQL 包含一个JOIN。 EF 为您完成所有工作。

      【讨论】:

        猜你喜欢
        • 2011-07-04
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 2012-09-04
        • 2017-11-30
        • 2016-12-22
        • 1970-01-01
        相关资源
        最近更新 更多