前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何实现Conditional Include

如何实现Conditional Include

作者头像
跟着阿笨一起玩NET
发布2018-09-19 16:53:19
5140
发布2018-09-19 16:53:19
举报

本文转载: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")

解决方案

下面的变通方法可以实现上面的要求:
代码语言:javascript
复制
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,你可以像下面这样:

代码语言:javascript
复制
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。

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

代码语言:javascript
复制
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改进)将可以应用到你的高级应用中。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-11-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 下面的变通方法可以实现上面的要求:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档