本文转载: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. jQuery autoComplete 样式

    前提:使用了jQuery-ui 官网:http://jqueryui.com/autocomplete/ /*** autocomplete ***/ .ui-widget-content { bac ...

  2. web-ylbtech-数据库备份-数据库设计

    ylbtech-DatabaseDesgin:web-ylbtech-数据库备份-数据库设计 DatabaseName:ylbtech Model:备份 Type:数据库备份设计 Url: 1.A,数 ...

  3. C++模板知识小结

    模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性.模版可以分为两类,一个是函数模版,另外一个是类模版. 由于类模板包含类型参数,因 ...

  4. kali linux 一些工具及命令集1(搜集DNS信息)

    DNS信息收集 1.dnsdict6   用于查看ipv6的dns信息,国内很少ipv6,基本无用 2.dnsmap 收集dns信息,同类别还有dnsenum,dnswalk 使用dnsmap需先找到 ...

  5. oracle 查看表的相关信息

    1.查看当前用户的表 SELECT * FROM user_tables; 2.查看指定用户的表 SELECT * FROM all_tables WHERE owner = 'SYS';

  6. 【LeetCode】111 - Minimum Depth of Binary Tree

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  7. 常用SQL整理

    整理了日常用到的一些sqls 1.插入表 insert into table_B select * from table_A 2.清空表 truncate table test #清空表,结构还存在d ...

  8. [转]eoe社区cocos2d-x游戏引擎知识大汇总

    [eoeAndroid 社区]特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或.从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工 师.希望大家能够一起的学习,和大 ...

  9. 第二百一十天 how can I 坚持

    Node.js 服务器端JavaScript,单进程. 该如何学习啊,貌似学什么都学不深入. 纠结死了. 睡觉.

  10. c++builder XE8 线程 Thread

    thread Thread  c++builder XE8 / RAD 10 Settle delphi TThread.CreateAnonymousThread(MyMethod).Start; ...