EF 到值類型“System.Decimal”的強制轉換失敗,因爲具體化值爲 null。(轉載)

解決方案:

 DateTime?   date = dbfw.TMS10min.Select(d => (DateTime?)d.TIMESTAMP).Max();

 

 decimal? sum = _member.DbSet
.Where(q => q.MemberID == 11)
.Sum(q => (decimal?)q.ActiveAmount); //核心

 

轉載來源:https://blog.csdn.net/u011127019/article/details/53909325

一、使用EF訪問數據庫求和時經常遇到這樣的異常

“System.InvalidOperationException”類型的未經處理的異常在 EntityFramework.dll 中發生 

其他信息: 到值類型“System.Decimal”的強制轉換失敗,因爲具體化值爲 null。結果類型的泛型參數或查詢必須使用可以爲 null 的類型。

截圖:

異常代碼1:

 

  1.  
    decimal sum = _member.DbSet
  2.  
    .Where(q => q.MemberID == 11)
  3.  
    .Sum(q => q.ActiveAmount);

異常代碼2:

 

  1.  
    decimal sum = _member.DbSet.Where(q => q.MemberID == 11)
  2.  
    .Select(q => q.ActiveAmount)
  3.  
    .Sum();


 

二、原因:

 

拋出的原因:根據條件從數據庫篩選出的數據爲空,然後求和就拋出異常了。

解決方案:根據條件將篩選字段或數據行取到內存後,在求和

 

  1.  
    //將數據庫數據拿到內存再求和
  2.  
    decimal sum = _member.DbSet.Where(q => q.MemberID == 11)
  3.  
    .Select(q => q.ActiveAmount)
  4.  
    .ToList()
  5.  
    .Sum();

解決方案2:如果根據條件當篩選數據行不存在時,求和結果需要指定爲null時,可以這樣處理

 

  1.  
    decimal? sum = _member.DbSet
  2.  
    .Where(q => q.MemberID == 11)
  3.  
    .Sum(q => (decimal?)q.ActiveAmount); //核心

 

解決方案3(推薦):使用DefaultIfEmpty()

http://blog.csdn.net/u011127019/article/details/61413670

 

一、字符串類型最大值

1.字符串類型的最大值,和數據庫的字典排序最後一個相同,如果存在返回null

 

  1.  
    //字符串最大值,是字典排序最後一個
  2.  
    string max1 = _context.students.Max(q => q.sname);
  3.  
    Console.WriteLine(max1);
  4.  
     
  5.  
    //字符串最大值,如果不存在返回null
  6.  
    string max2 = _context.students
  7.  
    .Where(q => false)
  8.  
    .Max(q => q.sname);
  9.  
    Console.WriteLine(max2);
  10.  
    Console.WriteLine(max2 == null); //True
  11.  
    Console.WriteLine(max2 == ""); //False

 

二、數字類型最大值

1.數字類型最大值,和數據庫字段排序最後一個相同,如果沒有數據拋出異常。

 

  1.  
    //數字類型,獲取最大值爲正序排列最後一個值
  2.  
    decimal deci1 = _context.scores.Max(q => q.degree);
  3.  
    Console.WriteLine(deci1);

 

數字類型,獲取條件的數據不存在拋出異常
其他信息: 到值類型“System.Decimal”的強制轉換失敗,因爲具體化值爲 null。
結果類型的泛型參數或查詢必須使用可以爲 null 的類型。

 

  1.  
    decimal deci2 = _context.scores.Where(q => false).Max(q => q.degree);
  2.  
    Console.WriteLine(deci2);

解決方案1:

 

 

  1.  
    //解決方案1,使用DefaultIfEmpty(),推薦
  2.  
    var query = _context.scores.Where(q => false)
  3.  
    .Select(q => q.degree)
  4.  
    .DefaultIfEmpty();
  5.  
    Console.WriteLine(query.ToString());
  6.  
    decimal deci3 = query
  7.  
    .Max();
  8.  
    Console.WriteLine(deci3);

生成sql如下:

解決方案2:

 

 

  1.  
    //解決方案2,先判斷再取值,執行兩次數據庫查詢
  2.  
    decimal deci4 = 0;
  3.  
    if (_context.scores.Any())
  4.  
    {
  5.  
    deci4 = _context.scores.Max(q => q.degree);
  6.  
    }
  7.  
    Console.WriteLine(deci4);

解決方案3:

 

 

    1.  
      //解決方案3,內存取最大值
    2.  
      decimal deci5 = _context.scores
    3.  
      .Select(q => q.degree)
    4.  
      .ToList()
    5.  
      .Max();
    6.  
      Console.WriteLine(deci5);
    7.  

 

更多:

EntiryFramework中事務操作實例

EntityFramework中JSON序列化循環引用----JavaScriptSerializer

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章