2012-02-17 73 views
0

我正在製作一個基於實體框架和Scott Guthrie的Dynamic Linq庫的報表工具。如何從實體框架中的可空關係中選擇非空值

我試圖從相關表中選擇一個不可爲空的字段時遇到了一個障礙,當相關的記錄不總是在那裏。例如,我有一個Participant表,它具有一個可空的外鍵給Team表。這是因爲一些參與者將在一個團隊中,而有些則不會。困難在於,我想要提供一份報告,顯示參與者列表以及他們在團隊中的一些團隊信息。一個對球隊表中的列是不可爲空,所以當我嘗試使用一個標準投影或一個動態的它來選擇:

var standardProjection = data.Select(i => new 
    { 
     i.FirstName, 
     i.ParticipantTeam.CaptainPickupFlg <--- Non Nullable Boolean 
    }); 

    var dynamicProjection = data.Select("new (FirstName, ParticipantTeam.CaptainPickupFlg)"); 

我得到試圖枚舉結果時出現錯誤:

「由於物化值爲null,因此值類型'布爾'轉換失敗。結果類型的泛型參數或查詢必須使用可空類型。」

我該如何避免這個錯誤,並且只需將ParticipantTeam.CaptainPickupFlg物化爲匿名類型的可空布爾值?

ScottGu的動態LINQ的:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

回答

0
data.Where(i => i.ParticipantTeam != null).Select(i=> new 
    { 
     i.FirstName, 
     i.ParticipantTeam.CaptainPickupFlg 
    }); 

如果你需要所有的參與者,你有兩個選擇:

  • 如果你能負擔得起在返回的匿名類型可空字段:

    var standardProjection = data.Select(i => new 
    { 
        i.FirstName, 
        CaptainPickupFlg = (bool?)i.ParticipantTeam.CaptainPickupFlg 
    }); 
    
  • 如果這不是您的選擇,您s HOULD決定該字段的默認值:

    var standardProjection = data.Select(i => new 
    { 
        i.FirstName, 
        CaptainPickupFlg = ((bool?)i.ParticipantTeam.CaptainPickupFlg) ?? false 
    }); 
    

    擁有的false默認值。

+0

我不想過濾掉它們,因爲我仍然希望所有參與者都顯示。 – 2012-02-17 16:23:50

+0

@MrBell因此,如果參與者沒有ParticipantTeam,那麼您希望在返回結果的CaptainPickupFlg字段中做什麼?對或錯? – 2012-02-17 16:45:52

+0

既不,也不應該爲null – 2012-02-17 19:25:16