EntityFramework之原始查询如何查询未映射的值,你又知道多少?
前言
今天又倒腾了下EF,如题所示,遇到了一些问题,并最终通过尝试找到了解决方案,可能不是最终的解决方案,若你有更好的解决方案,望告知,同时通过阅读此文,定让你收获不少。
引入
当我们查询时一直是中规中矩的查询,当然,这并没有错,那是对实体的字段未加以限制,或者说是你项目中没有此业务。当映射我们将实体中的某些字段进行忽略,但是当查询时我们又需要查询忽略的字段,还没听懂?说的通俗一点就是:在项目中这样的需求肯定是存在的,我们实体中添加的属性,可能是通过其他实体映射到表而关联出来,此时我们完全不需要映射此实体的字段。下面我们来进行演示,一看便知。
演示
首先我们给出两个实体,学生类Student,以及小红花类Flower
public class Student
{
public int Id { get; set; } public string Name { get; set; } public int FlowerId { get; set; } public string FlowerRemark { get; set; } //此属性需要关联Flower类而获取,我们将其标记为不进行映射 } public class Flower
{
public int Id { get; set; } public string FlowerRemark { get; set; } }
映射类
public class FlowerMap : EntityTypeConfiguration<Flower>
{
public FlowerMap()
{
ToTable("Flower");
HasKey(p => p.Id);
}
} public class StudentMap : EntityTypeConfiguration<Student>
{
public StudentMap()
{
ToTable("Student");
HasKey(key => key.Id);
Property(p => p.Id);
Ignore(p => p.FlowerRemark);
} }
现在我们需要以Student类中FlowerId和Flower类中Id相等来获得学生类中FlowerRemark值。
var result = ctx.Database.SqlQuery<Student>("select S.Id, S.FlowerId, S.Name, F.FlowerRemark from Student S join Flower F on S.FlowerId = F.Id").ToList();
我们来看看其结果

是不是有点令你始料未及,其实仔细想想也对,从此我们可以得出如下结论:
若将属性标记为忽略映射此字段,当查询时将检测到此属性的标记为忽略所以此时也将忽略对此字段的查询,那么当然查询其结果将为null
既然问题已经暴露出来了,那来吧,我们就解决吧!
解决方案
第一步
既然是检测到此标记为忽略映射此字段,此时我们就将再定义一个类,用于转换的类即可,如下:
public class StudentViewModel
{
public int Id { get; set; } public string Name { get; set; } public int FlowerId { get; set; } public string FlowerRemark { get; set; }
}
最后一步
接下来查询时将返回的类型为 StudentViewModel 即可,而不再是Student。
var result = ctx.Database.SqlQuery<StudentViewModel>("select S.Id, S.FlowerId, S.Name, F.FlowerRemark from Student S join Flower F on S.FlowerId = F.Id").ToList();
我们再来看看其结果,成功解决

当然此时你若只是查询返回的当然肯定是Student的集合列表而非转换后的StudentViewModel,此时进行如下修改即可:
var result = ctx.Database.SqlQuery<StudentViewModel>("select S.Id, S.FlowerId, S.Name, F.FlowerRemark from Student S join Flower F on S.FlowerId = F.Id").ToList()
.Select(stu => new Student()
{
Id = stu.Id,
FlowerId=stu.FlowerId,
Name = stu.Name,
FlowerRemark = stu.FlowerRemark
}).ToList();
至此完美,结束。
总结
当用原始查询查询未映射到数据库表中的字段(因为此属性只是关联其他表而来,所以无需对其进行映射)时,查询其结果将为null,此时需要转换思路,即需要通过上述稍许转换即可达到我们目的。
EntityFramework之原始查询如何查询未映射的值,你又知道多少?的更多相关文章
- 为何在查询中索引未被使用 (Doc ID 1549181.1)
To Bottom * 为何在查询中索引未被使用 (Doc ID 1549181.1) To Bottom 文档内容 用途 排错步骤 高速检查 表上是否存在索引? 索引是否应该 ...
- 【Oracle】ORA-14400: 插入的分区关键字未映射到任何分区
问题描述: 工作中使用kettle将原始库中的数据抽取到标准库中,在抽取过程中报错:[ORA-14400: 插入的分区关键字未映射到任何分区]/[ORA-14400: inserted partiti ...
- Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)
Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...
- django系列5.5--分组查询,聚合查询,F查询,Q查询,脚本中调用django环境
一.聚合查询 aggregate(*args, **args) 先引入需要的包,再使用聚合查询 #计算所有图书的平均价格 from django.db.models import Avg Book.o ...
- Linq to SQL 语法查询(子查询 & in操作 & join )
var 子查询 = from c in ctx.Customers where (from o in ctx.Ord ...
- [django/mysql] 使用distinct在mysql中查询多条不重复记录值的解决办法
前言:不废话.,直接进入正文 正文: 如何使用distinct在mysql中查询多条不重复记录值? 首先,我们必须知道在django中模型执行查询有两种方法: 第一种,使用django给出的api,例 ...
- Activiti5 待审 待批任务 TaskQuery查询 条件查询 like查询
TaskQuery查询API 有两种方法可以从引擎中查询数据:查询API和原生查询.查询API提供了完全类型安全的API. 你可以为自己的查询条件添加很多条件 (所以条件都以AND组合)和精确的排序条 ...
- Python-select 关键字 多表查询 子查询
sql 最核心的查询语句!!!! 增删改 单表查询 select语句的完整写法 关键字的书写顺序 执行顺序 多表查询 笛卡尔积 内连接 左外连接 右外连接 全外连接 通过合并左外连接和右外连接 子查询 ...
- python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...
随机推荐
- network issue troubleshooting
Today we troubleshooting a lot of network issue by using commands like: ping <ip>/<computer ...
- <input>和<textarea>
作为一个刚刚涉足PHP开发的菜鸟,第一次使用博客.在这里分享一些经验给和需要的朋友,互相探讨.共同学习,希望对你有所帮助. 废话不多说,下面进入正题. 应该有朋友和我一样,需要用到文本框,要求它会自动 ...
- [转]Android Studio 里搭建自动化测试框架Robotium
Android的自动化测试框架可选择的不多,后来选了Robotium(https://code.google.com/p/robotium/),它的语法及易用性挺像我们用在iOS里的KIF. 官方文档 ...
- asp.net mvc引用控制台应用程序exe
起因:有一个控制台应用程序和一个web程序,web程序想使用exe程序的方法,这个时候就需要引用exe程序. 报错:使用web程序,引用exe程序 ,vs调试没有问题,但是部署到iis就报错,如下: ...
- HOW TO RUN A SPRINT PLANNING MEETING (THE WAY I LIKE IT)
This is a sample agenda for a sprint planning meeting. Depending on your context you will have to ch ...
- 编译链接 C++
预处理之后的源文件被称为一个编译单位,也即编译器的工作对象.为了使编译能够进行,程序员必须提供各种程序其他部分的声明来孤立分析一个编译单位.所有名字空间,类,函数都应该在他们所在的编译单位中有声明,所 ...
- JS简介,如何快熟JS。打下结实基础。
JS决定网页的行为,有行为就有逻辑,而计算机只是人工智能,你给它什么样的指令,它就会按照你的指令去运行. 有人会问,既然是给出指令,那还需要什么逻辑? 这里我举一个简单的小例子来说明一下! 到你想输入 ...
- 安装ant
从ant官方网站下载ant安装包:apache-ant-1.9.7-bin.tar.gz,解压 tar xvf apache-ant-1.9.7-bin.tar.gz -C /usr/java/ 配置 ...
- ABP理论学习之功能管理
返回总目录 本篇目录 介绍 功能类型 定义功能 检查功能 功能管理者 版本说明 介绍 大多数的Saas(多租户)应用都有不同 功能的 版本(包).因此,他们可以给租户(客户)提供不同的 价格和功能选项 ...
- Net作业调度(二) -CrystalQuartz远程管理
Source Code-1.6M 介绍 上篇已经了解Quartz.NET的基本使用方法了.但如果想方便的知道某个作业执行情况,需要暂停,启动等操作行为,这时候就需要个Job管理的界面. 本文介绍Qua ...