深入调研Linq to Objects Join Linq to Entity
最近工作中遇到数据库组合查询带来的一些问题,因此有必要调研一下Linq to Objects Join Linq to Entity。参考一些网友的代码案例,深入实践了一下使用EntityFramework Code First 下的组合查询。
准备环节:
(一) 在VS下创建一个控制台应用程序(LinqToObjectJoinEntity),定义一个MyObject类,如下:
public class MyObject
{
public int Identity { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
(二)然后再定义一个Entity类及EntityContext类。
public class Entity
{
public int EntityId { get; set; }
public string Name { get; set; }
public string Notes { get; set; }
}
public class EntityContext : DbContext
{
public IDbSet<Entity> Entitys { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>(); // 此处是避免使用EF创建出来的Entity表为复数形式,顺便吐槽下微软默认给复数的设计
modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.OneToManyCascadeDeleteConvention>(); // 此处是避免使用EF创建出的数据库包含数据迁移表
base.OnModelCreating(modelBuilder);
}
}
(三)使用EF创建准备数据(在Main()函数中实现):
using (var db = new EntityContext())
{
db.Entitys.Add(new Entity { EntityId = 1, Name = "Entity", Notes = "Notes" });
db.Entitys.Add(new Entity { EntityId = 2, Name = "Frame", Notes = "Mates" });
db.Entitys.Add(new Entity { EntityId = 3, Name = "Work", Notes = "Honor" });
db.SaveChanges();
}
Coding实践:
(1)重现Linq to Object Join Linq to Entity
#region Reproduce Linq to Object Join Linq to Entity
var objectNames = (from myObject in myObjects
join entity in db.Entitys
on myObject.Identity equals entity.EntityId
select myObject.Name).ToList();
#endregion
使用Sql Profiler观察到的查询语句如下:
SELECT
[Extent1].[EntityId] AS [EntityId],
[Extent1].[Name] AS [Name],
[Extent1].[Notes] AS [Notes]
FROM [dbo].[Entity] AS [Extent1]
属于全表查询,此乃Linq to objects Join Linq to Entity一大弊害。
(2)重现 Linq to Entity Join Linq to Object
#region Reproduce Linq to Entity Join Linq to Object
var entityName = (from entity in db.Entitys
join myObject in myObjects
on entity.EntityId equals myObject.Identity
select entity.Name).ToList();
#endregion
这个地方运行时会抛异常:
Only Primitive types ('Such as Int32, string, and Guid') are supported in this context
中文意思是“无法创建类型为“项目名.MyObject”的常量值。此上下文仅支持基元类型(“例如 Int32、String 和 Guid”)"
看来在涉及这种操作时,我们内存中的数据还不能是非基元类型。List<MyObject> objectList = new List<MyObject>();
MyObject要为int32, string或者Guid,才能运行通过,并且不是整表查询,而是针对name列的单独查询。
(3)改进 Linq to Entity Join Linq to Object
#region Linq to Entity Join Linq to Object(Resolve)
var identities = myObjects.Select(o => o.Identity);
var entitytNames = (from entity in db.Entitys
join identity in identities
on entity.EntityId equals identity
select entity.Name).ToList();
#endregion
这里Sql Profile监测到的查询语句为:
SELECT
[Extent1].[Name] AS [Name]
FROM [dbo].[Entity] AS [Extent1]
INNER JOIN (SELECT
1 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
2 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]
UNION ALL
SELECT
3 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable3]) AS [UnionAll2] ON [Extent1].[EntityId] = [UnionAll2].[C1]
虽是麻烦了些,查出来的东西只有一个。
此文只是针对性的简述下Linq to Object Join Linq to Entity的场景,在日常工作中可能不止于此。
代码见:https://github.com/Jashinck/LinqToObjectJoinEntity
深入调研Linq to Objects Join Linq to Entity的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- LINQ之LINQ to Objects(上)
LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. 1.LINQ体系结构 从上图可以看出,L ...
- 从LINQ开始之LINQ to Objects(上)
LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LIN ...
- Linq之旅:Linq入门详解(Linq to Objects)【转】
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...
- Linq之旅:Linq入门详解(Linq to Objects)(转)
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html 示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细 ...
- Linq之Linq to Objects
目录 写在前面 系列文章 linq to objects 总结 写在前面 上篇文章介绍了linq的延迟加载特性的相关内容,从这篇文章开始将陆续介绍linq to Objects,linq to xml ...
- LINQ to Objects系列(1)相关技术准备
LINQ to Objects是LINQ的一部分,是查询对象集合的一种语法.首先看一下LINQ的体系结构,这样对LINQ有一个大致的了解.如图. 第一篇文章主要是回顾一下学习LINQ to Objec ...
- 编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]
前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议29.区别LINQ查询中的IEnumerable<T ...
- Linq学习(一)-初涉Linq
一.何谓LINQ LINQ:Language Integrated Query语言集成查询,其本质是对ADO.NET结果集通过反射连同泛型特性转换成对象集,实现OR模型的转换 二.优点与缺点 优点:封 ...
随机推荐
- Apple App签名机制
概览 数字签名 签名机制与验证过程 操作流程 数字签名 摘要算法 将任意长度文本通过一个算法得到一个固定长度的文本. 源文本不同,计算结果必然不同 无法从结果反推源 例如,MD5和SHA算法 非对称加 ...
- Nuts.js01
1.简介 Vue ssr框架.支持vue2,vue-router,vuex,vue server render, vue meta 2.基本使用: vue init nuxt-community/ko ...
- Failed to open the key database file. c;\\User\\w\\Destop\\SecureCRT_FX6.5.3\\Config\\KnowHosts\\Hostsmap.txt这个问题的解决方法
1.首先将这段错误在百度翻译上面查询一下,是什么意思,查询结果如下: 打开密钥数据库文件失败.C:\用户\ w \平台\ securecrt_fx6.5.3 \\ \\ \\ hostsmap.txt ...
- handlebar.js模板引擎(轻页面小工程可用)
介绍 Handlebars 让你能够有能力高效地容易地创立语义化的模版.Handlebars兼容Mustache语法,在大多数情况下它可以读取Mustache的语法并在你当前模板中使用.具体点击这里 ...
- 前端每日实战:62# 视频演示如何用纯 CSS 创作一只蒸锅
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YvOzNy 可交互视频 此视频是可 ...
- jdk1.5之后,classpath不需要再配置
1.5之后更智能了. 设置了classpath之后,当前目录失效(在classpath中没找到就报错,不会再在当前目录继续找),所以要把当前目录添加到classpath,永久环境变量添加 .,临时环境 ...
- python之嵌套 闭包 装饰器 global、nonlocal关键字
嵌套: 在函数的内部定义函数闭包: 符合开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能 # global 将局部变量变成全局变量 num = 100 def fn1(): globa ...
- java CRC16 算法
代码摘自:https://www.cnblogs.com/lujiannt/p/9246256.html 1.CRC16算法 public class CRC16Util { /** * 计算CRC1 ...
- iview中遇到table的坑(已经修改了table的数据,但是界面没有更新)
https://blog.csdn.net/bigdargon/article/details/89381466 https://blog.csdn.net/qiuyan_f/article/deta ...
- redis作为消息队列的原理
Redis队列功能介绍 List 转:https://blog.csdn.net/cestlavieqiang/article/details/84197736 常用命令: Blpop删除,并获得该列 ...