本文转载: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. CMake Tutorial

    CMake Tutorial 介绍 CMake教程提供了一个循序渐进的指南,涵盖了CMake帮助解决的常见的系统构建问题.了解示例项目中各种主题是如何一起工作的会非常有帮助.教程文档和示例源代码可以在 ...

  2. git-config Manual Page(机翻版)

    Git-config手册页 名称 git-config-获取并设置存储库或全局选项 SYNOPSIS Git config[-type=][-fixed-value][-show-resource][ ...

  3. 条件随机场CRF简介Introduction to Conditional Random Fields

    Imagine you have a sequence of snapshots from a day in Justin Bieber's life, and you want to label e ...

  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. 【概率论】2-1:条件概率(Conditional Probability)

    原文地址1:https://www.face2ai.com/Math-Probability-2-1-Conditional-Probability转载请标明出处 Abstract: 本文介绍条件概率 ...

  6. SpringBoot @Conditional系列注解

    目录 @ConditionalOnClass.@ConditionalOnMissingClass @ConditionalOnBean.@ConditionalOnMissingBean @Cond ...

  7. HackerRank C++ || Conditional Statements

    Conditional Statements 题目: 输入(<=9)的数字返回相应英文字符串,(>9)返回"Greater than 9" 原题链接:link Answ ...

  8. CF1740F Conditional Mix

    CF1740F Conditional Mix 题目大意 有一个正整数 n n n和一个长度为 n n n的序列 a a a, 1 ≤ a i ≤ n 1\leq a_i\leq n 1≤ai​≤n. ...

  9. java定义异常的头文件_c++ 声明定义都在头文件中怎么include?

    瀉藥, @李毅 老大已經點名你出錯的地方了, @felix 老大也指出是ODR的問題, 看來窩除了能在上面說下原理沒什麼做了, 哈哈. 不過既然兩位老大都沒有將原理和你的庫結合, 那麼這個微小工作就由 ...

最新文章

  1. 上市13年,AI平台收入还能暴增131%,这家老牌AI公司正在“反杀”
  2. android Studio 配置LUA 开发环境
  3. SAP Spartacus org unit list点击item之后的页面跳转实现
  4. python打包工具哪个好用_python打包工具比较
  5. 贝塞尔曲线工具css,如何反转CSS中的贝塞尔曲线的实现方法
  6. hash table(开放寻址法-二次探查实现的哈希表)
  7. java怎么弄redis,java怎么使用redis
  8. STL14-set/multiset容器
  9. 2021年中国电子签名行业研究报告
  10. JVM虚拟机-Class文件之方法表集合
  11. 问题二:用C++输出第一张图片
  12. 二分法查找c语言程序_用C++写二分查找了!【手绘漫画】图解LeetCode之搜索插入位置(LeetCode 35)...
  13. 14. Django基础:关系映射
  14. 实战Python:详解利用Python和Pygame实现飞机大战
  15. python自定义二元一次函数_Python二元赋值实用技巧解析
  16. Win10中文输入法加入美式英文键盘并默认英文键盘
  17. 计算机学校排名高中,高中学校排名/全国高中排名一览表
  18. 转自随风飘荡自由飞翔 SQL技巧:快速把握一些异常精妙的SQL语句
  19. rrpp协议如何修改_《技术进阶:理解RRPP协议.ppt
  20. 怎么判断数字n是否为2的x次方,即2的幂次呢,比如2,4,8,16,32

热门文章

  1. Java bitset转string_Java 二进制和十进制互转,二进制和BitSet互转
  2. aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析
  3. python 为什么用%格式化_Python中应该使用%还是format来格式化字符串?
  4. GT Transceiver的复位与初始化(3)TX初始化和复位流程
  5. Verilog初级教程(3)Verilog 数据类型
  6. FPGA之道(47)时钟及时钟域
  7. 【 Overview 】ALGORITHMS FOR SOURCE LOCALIZATION
  8. 【C++】decltype作用探究,unsigned与signed混淆问题
  9. 一个NODE_ENV 引发的血案
  10. 分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较