代码之家  ›  专栏  ›  技术社区  ›  Rob Gray

使用NHibernate删除给定列表中不存在的记录

  •  0
  • Rob Gray  · 技术社区  · 14 年前

    public class Video 
    {
        public int Id { get; set; }
        // other fields omitted for brevity
        public IList<Genre> Genres { get; set; }
    }
    
    public class Genre 
    {
        public int Id { get; set; }
        public string Name { get; set; }
        // fields omitted for brevity
    }
    

    我需要定期刷新我的视频副本,这意味着我需要删除所有的视频,不再映射到特定的流派。在例行程序中,我将只有一个列表,目前已映射的视频流派,但我需要打破之间的联系,视频和流派的那些不再映射。

    在原始Sql中,我可以说:

    DELETE FROM VideoGenre WHERE GenreId=@GenreId AND VideoID NOT IN (@VideoIdList)
    

    其中VideoIdList可能是“1,2,3,4,5,6”。

    如何使用NHibernate完成相同的任务?我应该使用HQL还是原始SQL?

    另一种方法是检索与VideoIdList不匹配的所有视频(我希望此列表几乎总是空的-视频的类型不经常更改:)),然后从每个视频的类型集合中删除类型,然后更新()类型。这种方法看起来像是浪费了数据库的时间。缓存是否意味着只有一次旅行,并且有任何删除?

    1 回复  |  直到 14 年前
        1
  •  2
  •   rebelliard    14 年前

    比如说:

    var genreId = 25;
    var videos = new int[] { 1, 2, 3, 4, 5 };
    
    session.CreateQuery("DELETE FROM VideoGenre vg WHERE vg.GenreId=:genreId AND vg.VideoID NOT IN (:videos)")
           .SetParameter("genreId", genreId)
           .SetParameterList("videos", videos)
           .ExecuteUpdate();
    

    更多信息 here .