Jointure externe complète Linq avec enregistrements NULL C # à partir de datatables

S’il vous plaît quelqu’un peut-il aider? J’ai besoin de renvoyer une table sur Extn_In_Call_Records = Extn_Number et si l’un des côtés ne correspond pas, renvoyez toujours une valeur, comme une jointure SQL Full Outer. J’ai passé des heures à regarder ça mais je ne peux pas le faire fonctionner !! Je peux obtenir le code ci-dessous si je supprime l’union, mais il ne renvoie que les résultats correspondants. Le Datatable est en cours de création à partir de MYSQL. Toute aide serait formidable.

//Full Table DataTable fullext = new DataTable(); fullext.Columns.Add("Extn_In_Call_Records", typeof(ssortingng)); fullext.Columns.Add("Total_Calls", typeof(int)); fullext.Columns.Add("Extn_Number", typeof(ssortingng)); fullext.Columns.Add("Phys_Switch_Name", typeof(ssortingng)); //End Full Table try { //Full Result var result = from callrc in callrecdt.AsEnumerable() join physex in physextns.AsEnumerable() on callrc["Extn_In_Call_Records"] equals physex["Extn_Number"] .Union from physex in physextns.AsEnumerable() join callrc in callrecdt.AsEnumerable() on physex["Extn_Number"] equals callrc["Extn_In_Call_Records"] select fullext.LoadDataRow(new object[] { callrc["Extn_In_Call_Records"], callrc["Total_Calls"], physex["Extn_Number"] == null ? "" : physex["Extn_Number"], physex["Phys_Switch_Name"] == null ? "" : physex["Phys_Switch_Name"] }, false); result.CopyToDataTable(); fullresult.DataSource = fullext; 

Résultat à voir

 Extn_In_Call_Records Total_Calls Extn_Number Phys_Switch_Name null 20 0 Hospital null 310 1 Hospital 4 132 4 Hospital 2004 null null Hospital 2006 2 2006 Hospital 

Selon LINQ – Jointure externe complète , le moyen le plus simple de réaliser une jointure externe complète est de joindre deux jointures gauches. Une jointure à gauche dans LINQ (à l’aide de la syntaxe de méthode d’extension) prend la forme:

 var leftJoined = from left in lefts join right in rights on left.Key equals right.Key into temp from newRight in temp.DefaultIfEmpty(/* default value for right */) select new { /* use left and newRight to construct the joined object */ } 

Dans votre cas, vous voulez faire:

 // initialize some default elements to use later if // they're of the same type then a single default is fine var defaultPhysex = new {...}; var defaultCallrc = new {...}; var left = from callrc in callrecdt.AsEnumerable() join physex in physextns.AsEnumerable() on callrc["Extn_In_Call_Records"] equals physx["Extn_Number"] into temp from physex in temp.DefaultIfEmpty(defaultPhysex) select new { // callrc is accessible here, as is the new physex Field1 = ..., Field2 = ..., } var right = from physex in physextns.AsEnumerable() join callrc in callrecdt.AsEnumerable() on callrc["Extn_In_Call_Records"] equals physx["Extn_Number"] into temp from callrc in temp.DefaultIfEmpty(defaultCallrc) select new { // physex is accessible here, as is the new callrc Field1 = ..., Field2 = ..., } var union = left.Union(right);