DefaultIfEmpty C# with Example
DefaultIfEmpty is used to return a Default Element if the Sequence contains no elements. This Element can be the Default of the Type or a user defined instance of that Type. Example: var chars = new List() { "a", "b", "c", "d" }; chars.DefaultIfEmpty("N/A").FirstOrDefault(); // returns "a"; chars.Where(str => str.Length > 1) .DefaultIfEmpty("N/A").FirstOrDefault(); // return "N/A" chars.Where(str => str.Length > 1) .DefaultIfEmpty().First(); // returns null; Usage in Left Joins: With DefaultIfEmpty the traditional Linq Join can return a default object if no match was found. Thus acting as a SQL's Left Join. Example: var leftSequence = new List() { 99, 100, 5, 20, 102, 105 }; var rightSequence = new List() { 'a', 'b', 'c', 'i', 'd' }; var numbersAsChars = from l in leftSequence join r in rightSequence on l equals (int)r into leftJoin from result in leftJoin.DefaultIfEmpty('?') select new { Number = l, Character = result }; foreach(var item in numbersAsChars) { Console.WriteLine("Num = {0} ** Char = {1}", item.Number, item.Character); } output: Num = 99 Char = c Num = 100 Char = d Num = 5 Char = ? Num = 20 Char = ? Num = 102 Char = ? Num = 105 Char = i In the case where a DefaultIfEmpty is used (without specifying a default value) and that will result will no matching items on the right sequence one must make sure that the object is not null before accessing its properties. Otherwise it will result in a NullReferenceException. Example: var leftSequence = new List { 1, 2, 5 }; var rightSequence = new List() { new { Value = 1 }, new { Value = 2 }, new { Value = 3 }, new { Value = 4 }, }; var numbersAsChars = (from l in leftSequence join r in rightSequence on l equals r.Value into leftJoin from result in leftJoin.DefaultIfEmpty() select new { Left = l, // 5 will not have a matching object in the right so result // will be equal to null. // To avoid an error use: // - C# 6.0 or above - ?. // - Under - result == null ? 0 : result.Value Right = result?.Value }).ToList();