前言
今天又倒騰了下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,此時需要轉換思路,即需要通過上述稍許轉換即可達到我們目的。
