标签:
今天又倒腾了下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; } }
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();
至此完美,结束。
EntityFramework之原始查询如何查询未映射的值,你又知道多少?
标签:
原文地址:http://www.cnblogs.com/CreateMyself/p/4862593.html