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,此时需要转换思路,即需要通过上述稍许转换即可达到我们目的。

 

时间: 2024-10-23 09:38:57

EntityFramework之原始查询如何查询未映射的值,你又知道多少?的相关文章

在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗

问题描述 在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗 在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗 解决方案 先搞明白是不是用了数据库,如果我用了,你就去查具体的查找代码,估计是没有匹配上

【MOS】为何在查询中索引未被使用 (文档 ID 1549181.1、英文文档为67522.1)

为何在查询中索引未被使用 (文档 ID 1549181.1)   "为什么索引没有被使用"是一个涉及面较广的问题.有多种原因会导致索引不能被使用.首要的原因就是统计信息不准,第二原因就是索引的选择度不高,使用索引比使用全表扫描效率更差.还有一个比较常见的原因,就是对索引列进行了函数.算术运算或其他表达式等操作,或出现隐式类型转换,导致无法使用索引.还有很多其它原因会导致不能使用索引,这个问题在MOS(MOS即My Oracle Support)"文档1549181.1为何在查

C#查询SqlServer数据库并返回单个值的方法

  本文实例讲述了C#查询SqlServer数据库并返回单个值的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 static public string GetSqlAsString(string sqlText, SqlParameter[] sqlParameters, string databaseConnectionString) { string result = ""; Sq

sql模糊查询怎样查询列名在字段中的查询

问题描述 sql模糊查询怎样查询列名在字段中的查询 select album, aritst as a from CD where album like '%a%' album artist 都是列名 CD 是表名, 我题目的意思是 如何让 like '%a%' 中的a 代表的是artist的别名 而不是 字母a 解决方案 直接将a定义为变量 set n='a' select album, aritst as @n from CD where album like '%' + @n + '%'

plsql-PLSQL循环嵌套查询,查询结果一直不打印输出

问题描述 PLSQL循环嵌套查询,查询结果一直不打印输出 declare -- Local variables here i integer := 1; currentdate timestamp; ninsdate timestamp; nseqid number; ndate varchar2(10); nspid varchar2(10); po INTEGER; begin ndate := '201506'; nspid := '33474'; po:=0; select sysdat

公交查询如何实现 换乘查询 站点查询 路线查询 的功能

问题描述 公交查询如何实现 换乘查询 站点查询 路线查询 的功能 公交查询如何实现 换乘查询 站点查询 路线查询 的功能 谁有具体代码 急求 解决方案 这得有gis技术的支持吧? 解决方案二: 微信公众平台天气查询,火车票查询,快递查询,小黄鸡,翻译,公交查询的实现微信公众平台天气查询,火车票查询,快递查询,小黄鸡,翻译,公交查询的实现

c# 数据库表连接查询-C#代码中查询数据库查询两个连接起来的表怎么获取数据并把数据放到DataSet中?

问题描述 C#代码中查询数据库查询两个连接起来的表怎么获取数据并把数据放到DataSet中? 以下是获取所有信息的代码函数: public static DataSet GetAllInfos() { string sql = "select InfoID,InfoTitle,InfoTime,InfoContent,i.AccountID,a.AccountName from Info as i inner join Account as a on i.AccountID = a.Accoun

字符-php中模糊查询出现查询不匹配

问题描述 php中模糊查询出现查询不匹配 模糊查询,查询出来的结果跟输入的字符不一样.我昨天查询'生',出现结果有俩个'生产部'.'销售部'.查询我用的是 like '%字符%'.哪位可以帮忙解决.谢谢. 解决方案 销售部也能查询出来?你确认你显示的字段和你查询的字段同一个?还是查询的另外一个字段,显示的和查询字段不一样什么的 解决方案二: $sql=""select R_AddressR_NoR_IDR_DescR_Status from A_Repository where R_A

有关struts2中的表单标签回显查询到对象的某个属性值

问题描述 有关struts2中的表单标签回显查询到对象的某个属性值 action中的方法: public String userEdit() { elecUser=elecUserService.findById(elecUser.getUserId()); // ActionContext.getContext().getValueStack().pop(); ActionContext.getContext().getValueStack().push(elecUser); return "