Convert SQL to Linq left join with null Convert SQL to Linq left join with null sql sql

Convert SQL to Linq left join with null


You want to use .DefaultIfEmpty, as per this question.

var query = from p in Programs            join pl in ProgramLocations                on p.ProgramID equals pl.ProgramID into pp            from pl in pp.DefaultIfEmpty()            where pl == null            select p;

Here's a full, working example with some mock data objects:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LinqTest{    class LinqProgram    {        public class Program        {            public int ProgramID { get; set; }            public string ProgramName { get; set; }        }        public class ProgramLocation        {            public int ProgramLocationID { get; set; }            public int ProgramID { get; set; }            public string ProgramLocationName { get; set; }        }        public static List<Program> Programs = new List<Program>();        public static List<ProgramLocation> ProgramLocations = new List<ProgramLocation>();        static void Main(string[] args)        {            FillTestData();            var query = from p in Programs                        join pl in ProgramLocations                            on p.ProgramID equals pl.ProgramID into pp                        from pl in pp.DefaultIfEmpty()                        where pl == null                        select p;            foreach (var r in query)            {                Console.WriteLine("{0}: {1}", r.ProgramID, r.ProgramName);            }            Console.ReadLine();        }        private static void FillTestData()        {            var p = new Program()            {                ProgramID = Programs.Count + 1,                ProgramName = "Scary Lesson"            };            var pl = new ProgramLocation()            {                ProgramLocationID = ProgramLocations.Count + 1,                ProgramID = p.ProgramID,                ProgramLocationName = "Haunted House"            };            Programs.Add(p);            ProgramLocations.Add(pl);            p = new Program()            {                ProgramID = Programs.Count + 1,                ProgramName = "Terrifying Teachings"            };            pl = new ProgramLocation()            {                ProgramLocationID = ProgramLocations.Count + 1,                ProgramID = p.ProgramID,                ProgramLocationName = "Mystical Mansion"            };            Programs.Add(p);            ProgramLocations.Add(pl);            p = new Program()            {                ProgramID = Programs.Count + 1,                ProgramName = "Unassociated Program"            };            Programs.Add(p);        }    }}


Try this

  var progy = (         from u in db.ProgramLocations join b in db.Programs         on u.ProgramID equals b.ProgramID into yG          from y1 in yG.DefaultIfEmpty()          where y1 == null         select u.ProgramID        ).ToList();

You can check this post on MSDN.

Hope this works for you.


Could you use except instead?

var progy = (  from u in db.ProgramLocations  select u.ProgramID).Except(from b in db.Programs select b.ProgramID);