回到目录

对EF开发来说,导航属性肯定都用过,事实上,它是由VS IDE工具根据你的数据库关系结构自动生成的外键属性,在类视图中可以看到相关属性,它是以外键表名来标识的,如果是一对多的关系,那么,它会为属性加上ICollection泛型集合用来标识,而今天我们要说的当然不是自动生成的,而是手动加的属性,这样属性需要我们手动进行join,然后把它按需赋值,而使用include当然是无效的,呵呵。

一般地,我们习惯上把集合属性定义为List<T>,但是,对于linq to entities来说,这个东西并不是很受欢迎,而标准结果集大家都知道是IEnumerable<T>,它是所有集合的基类,自身只提供了集合遍历的方法,这也是我们不用它作为导航属性的原因,因为我们一般需要为导航集合赋值的,而使用IEnumerable赋值就比较麻烦,需要借助List等集合。

引入IEnumerable的原因主要是List无法实现一个复杂的查询,如图:

这个查询返回一个派生类型,下面的复杂查询将会用到上面的结果,而这时,List类型的导航属性将是不被允许的

我们通过监视器可以看到,查询返回的默认是IEnumerable,所以,我们要属性改为IEnumerable,结果当然是正常的

而我们之前不用IEnumerable的原因,就是因为它的方法太单调了,没有添加,移除,查找等方法,而这时,不用它又不行,所以,只能把它进行扩展了,呵呵

扩展方法如下:

/// <summary>/// IEnumerable接口的扩展方法,支持它的实现类是List的情况/// </summary>public static class IEnumerableExtensions{/// <summary>/// 向集合中添加元素/// </summary>/// <typeparam name="T"></typeparam>/// <param name="collection"></param>/// <param name="value"></param>public static void Add<T>(this IEnumerable<T> collection, T value){(collection as List<T>).Add(value);}/// <summary>/// 从集合中删除元素/// </summary>/// <typeparam name="T"></typeparam>/// <param name="collection"></param>/// <param name="value"></param>public static void Remove<T>(this IEnumerable<T> collection, T value){(collection as List<T>).Remove(value);}/// <summary>/// 检索集合中是否包含某个元素/// </summary>/// <typeparam name="T"></typeparam>/// <param name="collection"></param>/// <param name="value"></param>/// <returns></returns>public static bool Contains<T>(this IEnumerable<T> collection, T value){return (collection as List<T>).Contains(value);}}

调用也是十分简单,和List类型的一样样,呵呵,舒服!

回到目录

转载于:https://www.cnblogs.com/lori/p/3392876.html

EF架构~为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心相关推荐

  1. EF架构~将数据库注释添加导入到模型实体类中

    回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回  EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回  EF架构~为EF Db ...

  2. 【TcaplusDB知识库】GO快速上手PB表的增删查改操作

    PROTOBUF说明 PROTO表是基于PROTOBUF协议设计的TcaplusDB表,PROTOBUF协议是Google开源的通用RPC通信协议,用于TcaplusDB存储数据的序列化.反序列化等操 ...

  3. 火山视窗文本数组类增删查改操作

    本源码转载自利快云https://www.lkuaiy.com/ 火山视窗文本数组类增删查改操作     文本数组类可对文本型数据进行数组操作,本类可以非常方便的实现对文本数组的增删查改.   一.添 ...

  4. 火山视窗整数数组类增删查改操作

    本源码转载自利快云https://www.lkuaiy.com/ 火山视窗整数数组类增删查改操作     整数数组类可对整数数据进行数组操作,本类可以非常方便的实现对整数数组的增删查改.   一.添加 ...

  5. java调用js查询mongo_MongoDB增删查改操作示例【基于JavaScript Shell】

    本文实例讲述了MongoDB增删查改操作.分享给大家供大家参考,具体如下: MongoDB自带了一个JavaScript Shell,所以在其中使用js语法是可以的. Insert操作: 单条插入 v ...

  6. C++通过ODBC方式连接数据库SQLServer及增删查改操作【图书借阅系统为例】

    C++通过ODBC方式连接数据库SQLServer及增删查改操作[图书借阅系统为例] 文章目录 前言 一.ODBC如何配置 二.SQL Server如何设置账号密码 三.C++连接数据库以及增删查改操 ...

  7. 【MySQL】数据库中表的增删查改操作详解

    文章目录 前言 SQL的通用语法 一.表的创建与表的新增 语法 数据类型的介绍 演示 二.表的删除 语法 删整张表的语法 删记录的语法 演示 三.表的查询 查询整张表 (一)全列查询 (二)指定列查询 ...

  8. Hibernate一对多/多对一关系映射详解及相应的增删查改操作

    以客户与订单的关系为例 1.在实体模型类中绑定两者关系: 客户类: public class Customer {private Integer id;//客户idprivate String nam ...

  9. 数据结构C语言实现顺序表——增删查改操作实现详解

    顺序表 顺序表是什么? 顺序表是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示.实现增删查改的功能. 顺序表所需的头文件: #include<stdio.h> ...

最新文章

  1. (转)二叉树系列面试问题
  2. Note:HTTP服务器是如何实现对PHP支持的
  3. 人工智能70年,研究者们最不愿意面对的惨痛教训是……
  4. linux中Daemon守护进程编程
  5. [vue] vue如何监听键盘事件?
  6. [css] 说说你对媒体查询的理解
  7. 07 | 链表(下):如何轻松写出正确的链表代码?
  8. JSTL标签库中fmt标签,日期,数字的格式化
  9. (62)Verilog HDL模块例化system Verilog模块
  10. Let’ s Encrypt 现支持通配符的 HTTPS 认证
  11. 双“11”搞促销?用贪心算法盘它
  12. 从ASP.NET的PHP执行速度比较谈起
  13. Windows下React Native开发01 -- Android开发环境搭建
  14. 【李宏毅2020 ML/DL】P4 Basic Concept
  15. Scrum中的软件测试指南
  16. 广工学生“纯手工”打造赛车 将出征F1赛道
  17. 5、LATEX-algorithm2e伪代码中文模板
  18. 淘宝商家如何在得物做推广?得物推广有效果吗?
  19. python读xml文件生成.h头文件_Python创建xml文件示例
  20. 【屏蔽贴吧广告】贴吧广告屏蔽办法-解决方案 【普通用户 非会员】

热门文章

  1. Java中四种访问修饰符的区别
  2. imagepreview使用案例_微信小程序wx.previewImage预览图片实例详解
  3. 将文本计算机应用能力的样式设置为标题1,计算机应用基础期末考试试题
  4. 策划文档html,html代码整理.doc
  5. 你会怎样衡量你的产品? —— 一点产品数据分析的经验分享
  6. 2019春第十周作业
  7. 解决ntp的错误 no server suitable for synchronization found
  8. Servlet应用之细节
  9. mongodb中分页显示数据集的学习
  10. C# HttpRequest基础连接已经关闭: 接收时发生意外错误