2013-08-16 23 views
-1

當im過濾EF時,我得到一個null refrence異常,但我絕對無能爲力。如何調試EF 5空引用異常?

enter image description here

public IEnumerable<TonalityBatchModel> GetTonalityBatch(int briefID) 
{ 
    try 
    { 
     var brief = NeptuneUnitOfWork.Briefs.FindWhere(b => b.ID == briefID).FirstOrDefault(); 

     if (brief != null && brief.TonalityCriteria != null) 
        { 
         return brief.TonalityCriteria.TonalityBatches 
            .Select(b => new TonalityBatchModel() 
             { 
              BriefID = b.BriefID, 
              Status = b.TonalityCriteria.IsActive == true ?"Active":"Ended", 
              BatchID = b.ID, 
              CompetitorID = b.BriefCompetitorID, 
              Competitor = brief.BriefCompetitors.Where(i=>i.ID == b.BriefCompetitorID).Select(c=>c.Organisation.Name).First(), 
              Size = b.BatchSize, 
              StartDate = b.StartDate, 
              EndDate = b.EndDate, 
              IsPublished = b.Lookup_TonalityBatchStatus.ID == (int)TonalityBatchStatus.Published?"Yes":"No", 
              IsCompleted = b.Lookup_TonalityBatchStatus.ID == (int)TonalityBatchStatus.Completed ? "Yes" : "No", 
              IsAssigned = b.Lookup_TonalityBatchStatus.ID == (int)TonalityBatchStatus.Allocated ? "Yes" : "No", 
              ImportantCount = b.TonalityItems.Count(i=> i.IsImportant), 
              ArticlesCount = b.TonalityItems.Count, 
              FavourableCount = b.TonalityItems.Count(i => i.Lookup_TonalityScoreTypes.ID ==(int)TonalitySourceType.Favourable), 
              UnfavourableCount = b.TonalityItems.Count(i => i.Lookup_TonalityScoreTypes.ID ==(int)TonalitySourceType.Unfavourable), 
              NeutralCount = b.TonalityItems.Count(i => i.Lookup_TonalityScoreTypes.ID ==(int)TonalitySourceType.Neutral) 

             }).ToList(); 
        } 

        return new List<TonalityBatchModel>(); 

      } 
      catch (Exception ex) 
      { 
       Logger.Error(ex); 
       throw; 
      } 
     } 
+0

不是一個好問題。首先你想調試Linq庫,而不是實體框架。其次 - 你只需要弄清楚在這種情況下什麼是空。在沒有調試實體框架或系統庫的情況下更容易計算出來。 – Jarekczek

回答

1

你需要查詢降低到一個簡單的查詢,然後直到發生NullReferenceException開始建設來再試一次。看你的代碼,這裏有一些可能的地方(我正在做一些假設,因爲我不知道你的模型中的方方面面):

Competitor = brief.BriefCompetitors.Where(i=>i.ID == b.BriefCompetitorID).Select(c=>c.Organisation.Name).First() 

BriefCompetitors可能爲空。 c.Organisation可能爲空。

IsPublished = b.Lookup_TonalityBatchStatus.ID == (int)TonalityBatchStatus.Published?"Yes":"No", 

(和其他類似的行)b.Lookup_TonalityBatchStatus可能爲空。

ImportantCount = b.TonalityItems.Count(i=> i.IsImportant), 

(和其他類似的行)b.TonalityItems可能爲空。

0

我相信這是因爲你的計數返回null記錄。我可能是錯的但是這正在這裏產生的SQL是這樣的:

INNER JOIN TonalityItems i on i.Lookup_TonalityScoreTypes == x 

x(int)TonalitySourceType.Favourable值。由於此連接沒有匹配的結果,因此無法對count執行任何操作。你可以嘗試添加?? 0到查詢的末尾:

FavourableCount = b.TonalityItems.Count(i => i.Lookup_TonalityScoreTypes.ID ==(int)TonalitySourceType.Favourable) ?? 0, 
+0

空集上的Count()將返回0,而不是null,並且不是一個例外。但是,如果您調用某行'a.b.SomeSet.Count()',並且'a.b.SomeSet'爲空,您將得到一個NullReferenceException。 – Steve