如何实现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改进)将可以应用到你的高级应用中。
如何实现Conditional Include相关推荐
- CMake Tutorial
CMake Tutorial 介绍 CMake教程提供了一个循序渐进的指南,涵盖了CMake帮助解决的常见的系统构建问题.了解示例项目中各种主题是如何一起工作的会非常有帮助.教程文档和示例源代码可以在 ...
- git-config Manual Page(机翻版)
Git-config手册页 名称 git-config-获取并设置存储库或全局选项 SYNOPSIS Git config[-type=][-fixed-value][-show-resource][ ...
- 条件随机场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 ...
- 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 ...
- 【概率论】2-1:条件概率(Conditional Probability)
原文地址1:https://www.face2ai.com/Math-Probability-2-1-Conditional-Probability转载请标明出处 Abstract: 本文介绍条件概率 ...
- SpringBoot @Conditional系列注解
目录 @ConditionalOnClass.@ConditionalOnMissingClass @ConditionalOnBean.@ConditionalOnMissingBean @Cond ...
- HackerRank C++ || Conditional Statements
Conditional Statements 题目: 输入(<=9)的数字返回相应英文字符串,(>9)返回"Greater than 9" 原题链接:link Answ ...
- 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. ...
- java定义异常的头文件_c++ 声明定义都在头文件中怎么include?
瀉藥, @李毅 老大已經點名你出錯的地方了, @felix 老大也指出是ODR的問題, 看來窩除了能在上面說下原理沒什麼做了, 哈哈. 不過既然兩位老大都沒有將原理和你的庫結合, 那麼這個微小工作就由 ...
最新文章
- 上市13年,AI平台收入还能暴增131%,这家老牌AI公司正在“反杀”
- android Studio 配置LUA 开发环境
- SAP Spartacus org unit list点击item之后的页面跳转实现
- python打包工具哪个好用_python打包工具比较
- 贝塞尔曲线工具css,如何反转CSS中的贝塞尔曲线的实现方法
- hash table(开放寻址法-二次探查实现的哈希表)
- java怎么弄redis,java怎么使用redis
- STL14-set/multiset容器
- 2021年中国电子签名行业研究报告
- JVM虚拟机-Class文件之方法表集合
- 问题二:用C++输出第一张图片
- 二分法查找c语言程序_用C++写二分查找了!【手绘漫画】图解LeetCode之搜索插入位置(LeetCode 35)...
- 14. Django基础:关系映射
- 实战Python:详解利用Python和Pygame实现飞机大战
- python自定义二元一次函数_Python二元赋值实用技巧解析
- Win10中文输入法加入美式英文键盘并默认英文键盘
- 计算机学校排名高中,高中学校排名/全国高中排名一览表
- 转自随风飘荡自由飞翔 SQL技巧:快速把握一些异常精妙的SQL语句
- rrpp协议如何修改_《技术进阶:理解RRPP协议.ppt
- 怎么判断数字n是否为2的x次方,即2的幂次呢,比如2,4,8,16,32
热门文章
- Java bitset转string_Java 二进制和十进制互转,二进制和BitSet互转
- aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析
- python 为什么用%格式化_Python中应该使用%还是format来格式化字符串?
- GT Transceiver的复位与初始化(3)TX初始化和复位流程
- Verilog初级教程(3)Verilog 数据类型
- FPGA之道(47)时钟及时钟域
- 【 Overview 】ALGORITHMS FOR SOURCE LOCALIZATION
- 【C++】decltype作用探究,unsigned与signed混淆问题
- 一个NODE_ENV 引发的血案
- 分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较