Table de jointure Linq C #, où la table gauche peut être nulle

S'il vous plaît, voir mon exemple ci-dessous. Ici, pour l'amour de la question, j'ai 3 tables – mainTable , tableA et tableB . Dans les tables, les champs PK signifient les keys primaires, les champs FK signifient les champs étrangers.

J'ai du mal à join 3 tables. Dans mainTable, il y a le champ "nullableFK" qui fait reference à tableA. Cela pourrait être nul. Donc, pour join la tableA, j'utilise Left Join en utilisant DefaultIfEmpty (). Le problème commence, quand j'ai besoin de join la troisième table sur les champs qui correspondent dans la tableA et la tableB. l'exemple ci-dessous renvoie InvalidOperationException avec le message suivant:

 "The cast to value type 'System.Boolean' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type." 

J'ai essayé de joindre tableB sans DefaultIfEmpty – pour autant que je sache, ce serait une jointure interne. Mais alors la séquence ne contient aucun élément.

L'objective est

pour returnner les valeurs de mainTable , tableA et tableB .

Si dans mainTable , nullableFK est null, returnne mainTable , et les valeurs tableA et tableB sont nulles,

  var query = (from mainTable in db.mainTables where mainTable.PK == id join tableA_ in db.tablesA on mainTable.nullableFK equals tableA_.FK into A from tableA in A.DefaultIfEmpty() join tableB_ in db.tablesB on tableA.PK equals tableB_.PK into B from tableB in B.DefaultIfEmpty() select new { val1 = mainTable.fieldA, val2 = tableA.fieldB, val3 = tableB.fieldC }).First(); 

Réponse – Vérifiez null valeurs null dans select new {} .

Il semble que l'OP ait spécifié la réponse dans une modification de la question, mais la façon de l'implémenter n'était pas très claire. Il a dit de vérifier null dans le nouveau select {}.

J'ai été capable de faire ce travail en moulant les valeurs en types nullable. Dans l'exemple ci-dessous, je suppose que les deux tablesA.fieldB et tableB.fieldC sont de type int:

  var query = (from mainTable in db.mainTables where mainTable.PK == id join tableA_ in db.tablesA on mainTable.nullableFK equals tableA_.FK into A from tableA in A.DefaultIfEmpty() join tableB_ in db.tablesB on tableA.PK equals tableB_.PK into B from tableB in B.DefaultIfEmpty() select new { val1 = mainTable.fieldA, val2 = (int?)tableA.fieldB, val3 = (int?)tableB.fieldC }).First();