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 ...
随机推荐
- android 开发 gradle 自己会容易混淆的东西
使用intellij idea 开发android ,关于 gradle 和 android gradle plugin 容易混淆地方,做下记录: 一. build.gradle 文件有两个地方存在, ...
- rpm 看 rpm 包内容
1.命令 rpm #rpm -qpl packetname
- 【Telerik】实现列表单元格中添加复选框,进行状态(是、否)判断
前台界面: 需求:实现对每条细则是否必备进行判断,必备就勾选,否则不勾选. 首先:要保证列表GridView是可编辑的(IsReadOnly=false) 表格代码 其次:单元格的数据绑定要保证是双向 ...
- html5地理位置定位功能小析
Geolocationd 基本原理1.GPS GPS基本原理是测量出已知位置的卫星到用户接收机之间的距离,然后综合多颗卫星的数据就可知道接收机的具体位置.适用于具备GPS功能的设备(1)优点:在 ...
- 常用类-StringBuffer
总结:凡是要频繁的修改字符串内容的时候,都要使用StringBuffer类来完成,而且在StringBuffer类里提供了一些在String类中没有的,包括:delete(),insert()等等 / ...
- sass/scss 和 less的区别
一. Sass/Scss.Less是什么? Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,Sass语法属于缩排语法,比css比多出好些功能(如变量 ...
- DataTable扩展方法ToList<T>()、ToJSON()、ToArrayList()
/// <summary> /// 扩展方法类 /// </summary> public static class CommonExtension { /// <sum ...
- EF 连接sql2000
正常连接会提示版本低 可以先用ef连接高版本的sql然后新建好EDMX文件后,在右键xml方式打开,把ProviderManifestToken="2008" 改为2000 然后再 ...
- [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法
原文地址:http://blog.csdn.net/watkinsong/article/details/9849973 有一种方式不需要自己配置所有的Sun JDK, Android SDK以及ND ...
- SQL Server差异备份的备份/还原原理
SQL Server差异备份的备份/还原原理 记住一点:差异备份是基于最后一次完整备份的差异,而不是基于最后一次差异的差异 备份过程: 1-完整备份之后有无对数据库做过修改,如果有,记录数据库的最 ...