zoukankan      html  css  js  c++  java
  • 如何实现Conditional Include

    本文转载:http://www.cnblogs.com/brusehht/archive/2010/09/01/1814962.html

    问题描述

    有些朋友希望使用这样的一种查询方式,比如要查询Movies实体对象,同时想通过预先加载方式加载相关的Reviews对象,但是又希望只加载符合条件的部分Reviews。

    很不幸的是,EF并不能满足这样的功能ObjectQuery<Movie>.Include(…)方法只能加载全部或者全部不加载。

     var dbquery=ctx.Movies.Include("Reviews").Where(g=>g.Genre == "Horror")

    解决方案

    下面的变通方法可以实现上面的要求:

    public class Movie
    {
        public int ID {get;set;}
        public string Name {get;set;}
        public string Genre {get;set;}
        public List<Review> Reviews {get;set;}
    }
    public class Review
    {
        public int ID {get;set;}
        public int Stars {get;set;} 
        public string Summary {get;set;}
        public Movie Movie {get;set;}
        public User User {get;set;}
    }

    假设你想要获取影片“Horror”所述的带有5颗星的Reviews,你可以像下面这样:

    var dbquery =
       from movie in ctx.Movies
       where movie.Genre == “Horror”
       select new {
          movie, 
          reviews = from review in movie.Reviews
                    where review.Stars == 5
                    select review
       };

    var movies = dbquery
       .AsEnumerable()
       .Select(m => m.movie);

    现在来看一下上面的代码为什么能够成功执行?

    首先第一个查询就创建了一个包含所有Horror影片及其包含5颗星的Reviews的新的实例。

    第二个查询利用LINQ to Object的AsEnumerable()方法进行了一次内存查询,简单的采用非拆包方式从匿名类型中得到了相关的实例,内每个Movie中将包含了经过过滤的Reviews。

    所以下面的代码断言都将通过,

    foreach(var movie in movies)
    {
        foreach(var review in movie.Reviews)
            Assert(review.Rating == 5);
    }

    上面的代码能够实现的原因是因为EF引入了一种叫做relationship fix-up的机制。

    relationship fix-up假设所有相关的对象将在第二种实体对象进入到ObectContext的时候被自动挂接,这里我们在讲对象装载入ObjectContext的时候只包含了相应的Movie和经过过滤的相关的Reviews,EF就默认为他们已经自动挂接了,那意味着那些被过滤的Reviews将自动填充Movie的Review数组。

    简而言之,这种Relationship fix-up方式(我这里叫他Relationship改进)将可以应用到你的高级应用中。

  • 相关阅读:
    jQuery基础【1】
    qTip2 精致的jQuery提示信息插件
    jquery tools 系列(三)——scrollable(2)
    JQuery常用函数及功能小结
    【转】JQ命令汇总 jQuery
    jquery tools系列(一)——tabs(选项卡/页签)
    jquery tools系列(四)——overlay
    肚子
    今天买了部数码相机NiKon S510
    《文渊阁四库全书》书目
  • 原文地址:https://www.cnblogs.com/51net/p/4130192.html
Copyright © 2011-2022 走看看