博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntityFramework之原始查询如何查询未映射的值,你又知道多少?
阅读量:6716 次
发布时间:2019-06-25

本文共 2596 字,大约阅读时间需要 8 分钟。

前言

今天又倒腾了下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
{ public FlowerMap() { ToTable("Flower"); HasKey(p => p.Id); } } public class StudentMap : EntityTypeConfiguration
{ 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
("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
("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
("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,此时需要转换思路,即需要通过上述稍许转换即可达到我们目的。

 

转载于:https://www.cnblogs.com/CreateMyself/p/4862593.html

你可能感兴趣的文章
在 UWP 应用中创建、使用、调试 App Service (应用服务)
查看>>
Active MQ C#实现
查看>>
C#实现秒表程序
查看>>
cJSON 使用笔记
查看>>
CF1163E Magical Permutation
查看>>
BroadcastReceiver
查看>>
redis备份实操
查看>>
重要更新-Word 2003查找替换最后一个实例的第四种方法
查看>>
实现大屏幕全国监控各地流量和负载质量
查看>>
高性能HTTP加速器Varnish(安装配置篇)
查看>>
如何取消OneNote的粘贴来源地址
查看>>
编程乐趣:C#实现读取12306余票信息
查看>>
视频编码的常见参数基本概念
查看>>
用python写一个专业的传参脚本
查看>>
Nginx+PHP7 安装及配置
查看>>
OpenIndiana
查看>>
varnish基础概念详解
查看>>
发一个windows8 下QQ应用的测试报告-精彩截图
查看>>
利用Zabbix ODBC monitoring监控MySQL
查看>>
如何设计一款优秀的短视频 SDK
查看>>