Entity FrameworkとScott GuthrieのDynamic Linqライブラリに基づいたレポートツールを作成しています。
関連するレコードが常にそこにないときに、関連するテーブルからnull以外のフィールドを選択しようとすると、問題が発生しました。たとえば、チームテーブルへのnull入力可能な外部キーを持つパティシパントテーブルがあります。これは、一部の参加者がチームに参加し、一部は参加しないためです。問題は、チームに参加している場合、参加者のリストとチーム情報の一部を示すレポートを取得したいことです。チームテーブルの列の1つはnull可能ではないため、標準の投影または動的な投影を使用して選択しようとすると、次のようになります。
var standardProjection = data.Select(i => new
{
i.FirstName,
i.ParticipantTeam.CaptainPickupFlg <--- Non Nullable Boolean
});
var dynamicProjection = data.Select("new (FirstName, ParticipantTeam.CaptainPickupFlg)");
結果を列挙しようとするとエラーが発生します。
「実体化された値がnullであるため、値の型 'Boolean'へのキャストは失敗しました。結果の型のジェネリックパラメーターまたはクエリでnull可能な型を使用する必要があります。
このエラーを回避して、ParticipantTeam.CaptainPickupFlgを匿名型のnull許容ブール値として具体化するにはどうすればよいですか?
ScottGuの動的Linq: http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
data.Where( i => i.ParticipantTeam != null ).Select( i=> new
{
i.FirstName,
i.ParticipantTeam.CaptainPickupFlg
});
すべての参加者が必要な場合は、2つのオプションがあります。
返された匿名型でnull許容フィールドを使用できる場合:
var standardProjection = data.Select(i => new
{
i.FirstName,
CaptainPickupFlg = (bool?)i.ParticipantTeam.CaptainPickupFlg
});
それが選択肢にならない場合は、そのフィールドのデフォルト値を決定する必要があります。
var standardProjection = data.Select(i => new
{
i.FirstName,
CaptainPickupFlg = ((bool?)i.ParticipantTeam.CaptainPickupFlg) ?? false
});
デフォルト値はfalse
です。