本文转载: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改进)将可以应用到你的高级应用中。

如何实现Conditional Include的更多相关文章

  1. (翻译)Entity Framework技巧系列之十 - Tip 37 - 41

    提示37. 怎样进行按条件包含(Conditional Include) 问题 几天前有人在StackOverflow上询问怎样进行按条件包含. 他们打算查询一些实体(比方说Movies),并且希望预 ...

  2. Entity Framework技巧系列之十 - Tip 37 - 41

    提示37. 怎样进行按条件包含(Conditional Include) 问题 几天前有人在StackOverflow上询问怎样进行按条件包含. 他们打算查询一些实体(比方说Movies),并且希望预 ...

  3. 第19课 类型萃取(3)_类型选择的traits

    1. std::conditional (1)原型:template <bool Cond, class T, class F> struct conditional; //根据条件获取T ...

  4. Conditional project or library reference in Visual Studio

    Conditional project or library reference in Visual Studio In case you were wondering why you haven’t ...

  5. (转)Image Segmentation with Tensorflow using CNNs and Conditional Random Fields

    Daniil's blog Machine Learning and Computer Vision artisan. About/ Blog/ Image Segmentation with Ten ...

  6. 30天代码day3 Intro to Conditional Statements

    Boolean A logical statement that evaluates to true or false. In some languages, true is interchangea ...

  7. Create a conditional DNS forwarder on our domain.com to Amazon default DNS provider

    Backgroup: I have an AWS Managed Active Directory(domain.com). I created a DHCP options set  to my d ...

  8. 浅谈JSP中include指令与include动作标识的区别

    JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...

  9. CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率

    CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率 当场景中有比较复杂的模型时,条件渲染能够加速对复杂模型的渲染. 条件渲染(Conditio ...

随机推荐

  1. 看来ms sql server if 中定义个变量出了if 还是可以用的

    begin declare @abc int; end print @abc 可以打出1出来

  2. pageX,clientX,offsetX,layerX的区别

    pageX,clientX,offsetX,layerX的区别 在各个浏览器的JS中,有很多个让你十分囧的属性,由于各大厂商对标准的解释和执行不一样,导致十分混乱,也让我们这些前端攻城狮十分无语和纠结 ...

  3. 新的小游戏发布啦。Pop Jungle

    丛林爱消除是一款画面清新,效果绚丽的消除类休闲游戏.你只需要选中尽可能多的图块,并消除它们就可以得到高分,并有无限多的关卡等待你去征服.一旦你开始玩儿你将无法停止下来,如果你还是消除星星的粉丝,那你更 ...

  4. LoadRunner界面分析(二)

    1.Controller 2.创建运行场景 3.方案设计 4.Resuls settting 5.监视方案

  5. 为什么大型网站前端使用PHP后台逻辑用Java

    前两周参加完 ThinkInLamp 的 PHP 架构师大会,听鸟哥一上午的分享,感慨很多,PHP 业界虽然方向不明荒废了两三年的时间,终究还是又重新崛起了. 其实包括 Java 的重启问题,现在也已 ...

  6. JS代码的简单重构与优化

    JS代码的简单重构与优化(适合新手) 原文  http://www.cnblogs.com/similar/p/5016424.html Demo . 1 //bad if (age > 20) ...

  7. 关系数据库&amp;&amp;NoSQL数据库

    在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发.因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库. ...

  8. 使用Powershell 添加,选择更改订阅

    PS C:\WINDOWS\system32> Import-AzurePublishSettingsFile 'C:\Users\Ling\Desktop\Free-11-24-2014-cr ...

  9. cocos2d-html5将js编译为jsc

    在d:\DevTool\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\cocos2d-console\console 有 cocos2d_jscompile.py coc ...

  10. openstack neutron