EF select 匿名類 問題


連續兩次被相同問題困擾。

一、舉例

var query=db.StudentScore.Where(r=> r.SubjectId==subjectId).Select(g=> new  {SubjectId=SubjectId,Score=g.Score}).ToList();
 
這是一段平常的代碼,但有時候他會報錯:匿名類無法轉換為實體類StudentScore。
 
1期初,我是這么想的:
 new StudentScore
var query=db.StudentScore.Where(r=> r.SubjectId==subjectId).Select(g=>new StudentScore {SubjectId=SubjectId,Score=g.Score}).ToList();
但還是報錯!原因還是匿名類無法轉換為實體類StudentScore。
問:為什么不能轉換為自己呢?答: 難道因為實體類中有外鍵或者字段數量上不匹配嗎。。
 
2 新建了一個類
StudentScoreTemp   就兩個屬性 SubjectId、 Score
var query=db.StudentScore.Where(r=> r.SubjectId==subjectId).Select(g=> new StudentScoreTemp    {SubjectId=SubjectId,Score=g.Score}).ToList();
轉換成功。
 
3后來發現CSDN 已經有答案 https://bbs.csdn.net/topics/390777388
其中還記錄了另一種方法:query就是個集合,你遍歷就行了
foreach(var v in query)  遍歷的時候按自己需要重新組裝成需要的形式。
 
4還發現了一個錯誤的方法:
var query=db.StudentScore.Where(r=> r.SubjectId==subjectId).AsEnumerable().Select(new StudentScoreTemp() { ... }).ToList()
錯誤原因:
AsEnumerable() 時會去數據庫查詢數據,相當於把數據先查詢出來到內存中,再在內存中通過Select篩選。如果數據量較大是非常消耗內存的!
原因詳情見 :https://www.cnblogs.com/joeatgz/p/5180788.html
 
5 新發現
var query=db.StudentScore.Where(r=> r.SubjectId==subjectId).Select(g=>g ).ToList();
 這樣可以查詢所有字段,但是如果有關聯表,序列化時容易報錯。
 

6  Select的時候,時間無法轉換成 年月日  YYMMMdd

報錯:LINQ to Entities 不識別方法“System.String ToString(System.String)”,因此該方法無法轉換為存儲表達式。

解決1:先ToList到內存,然后再次Select時可以轉換。
解決2:  先匿名類接收數據, foreach循環或for 循環遍歷的時候按自己需要重新組裝成需要的形式。
例如:

var dataTemp = T_User.Skip((p.page - 1) * p.rows).Take(p.rows).ToList();
var data = dataTemp.Select(d => new
{
 d.UserID,
 CreateTime= d.CreateTime.ToString("yyyy-MM-dd")
//CreateTime= d.InvestigationTime.Value.ToString("yyyy-MM-dd") 

// 如果CreateTime 是可空值類型DateTime?或Nullable<System.DateTime> ,需要加Value。
});

 

public class IViewPageModel
{
public int page { get; set; }

public int rows { get; set; }

public string sort { get; set; }

public string order { get; set; }

public Filter[] filters { get; set; }

public string search { get; set; }


}

7 又發現EF復雜查詢好難呀!
這是對EF拉姆達表達式和linq語法不熟悉是很費時間的,其實可以
1直接在數據庫中創建視圖。
2EF也可以直接寫sql語句

  //1)查詢SqlQuery

   result.slList = db.Database.SqlQuery<DataTemp>("select Precision,Year,LandCover, sum(Area) as Area  from [EcoTypes]  where  LandCover=@type group by Precision, Year, LandCover", new SqlParameter("@type", "森林")).Select(d=> d.Area).ToList();

       //2)增刪改:ExecuteSqlCommand 

      db.Database.ExecuteSqlCommand("").ToString();

 
解決問題的一般流程總結:
1自己想
2百度
3官網文檔
4問大神
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM