Convert SQL to Linq left join with null

前端 未结 4 725
臣服心动
臣服心动 2020-12-08 09:10

How can I convert properly this SQL to linq

select  t1.ProgramID
from Program t1 LEFT JOIN ProgramLocation t2 ON  t1.ProgramID = t2.ProgramID 
where t2.Progr         


        
相关标签:
4条回答
  • 2020-12-08 09:28

    Could you use except instead?

    var progy = (
      from u in db.ProgramLocations
      select u.ProgramID
    ).Except(from b in db.Programs select b.ProgramID);
    
    0 讨论(0)
  • 2020-12-08 09:30

    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);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 09:34
    SELECT pfa.PetID, pt.PetTypeDesc, pfa.petname, pf.PetOwner, pf.remarks, pat.AdoptedBy
        FROM dbo.PetForAdoption pfa
        JOIN dbo.PetAdoptionTran pat
        ON pfa.PetID = pat.PetID
        JOIN dbo.PetTypes pt 
        ON pfa.PetTypeID = pt.PetTypeID
        JOIN dbo.PetProfile pf
        ON pfa.PetID = pf.PetID
        ORDER BY pt.PetTypeDesc
    
    0 讨论(0)
  • 2020-12-08 09:41

    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.

    0 讨论(0)
提交回复
热议问题