簡體   English   中英

C# LINQ 無法進行左連接

[英]C# LINQ Unable to do LEFT JOIN

我是 LINQ 的新手,我正在嘗試學習 LEFT JOIN,但我無法讓它工作。 下面是我的代碼。 我也查詢SQL。 有人可以幫忙嗎?

This is my SQL Server Query:

SELECT DISTINCT 
    COALESCE(k.UnitNumber,'') MRN,  
    COALESCE(ip_inpt_admit.get_count,'') AS INPT_ADMIT,
FROM [TestDB]].[dbo].[AdmVisits] k 

        -- subset to pull population of the report
        INNER JOIN 
        (SELECT  k2.Name, 
                k2.BirthDateTime, 
                k2.UnitNumber,
                max(ServiceDateTime) AS MaxDate
           FROM [TestDB]].[dbo].[AdmVisits] k2
          WHERE (CONVERT(DATE, k2.ServiceDateTime)) between '2020-03-01' AND '2020-03-31' 
            AND k2.UnitNumber IS NOT NULL 
            AND k2.BirthDateTime IS NOT NULL 
          GROUP BY k2.Name, k2.BirthDateTime, k2.UnitNumber
         ) tm 
         ON k.ServiceDateTime = tm.MaxDate
         AND k.UnitNumber = tm.UnitNumber


        -- INPT_ADMIT: For Inpatient
        LEFT JOIN
        (SELECT Count (*) get_count,
                k1.UnitNumber
           FROM [TestDB]].[dbo].[AdmVisits] k1
          WHERE (CONVERT(DATE, k1.ServiceDateTime)) BETWEEN '2020-03-01' AND '2020-03-31'
           AND InpatientOrOutpatient = 'I'
         GROUP BY k1.UnitNumber
         )ip_inpt_admit
        ON k.UnitNumber = ip_inpt_admit.UnitNumber

您好,我是 LINQ 的新手,我正在嘗試學習 LEFT JOIN,但我無法讓它工作。 下面是我的代碼。 我也查詢SQL。 有人可以幫忙嗎? 這是我的 C# LINQ:

namespace Patient_Report
{

    class Global
    {
        public static string fileLocation = @"\\westernu-files\output\LINQ.txt";
    }


    class Program
    {    
        static void Main(string[] args)
        {
            AdmVisitsDataContext myContext = new AdmVisitsDataContext();
            using (TextWriter tw = new StreamWriter(Global.fileLocation))
            {
                DateTime dStartDate = Convert.ToDateTime("2020-03-01"); 
                DateTime dEndDate = Convert.ToDateTime("2020-03-31 23:59:59"); 

                string sStartTime = dStartDate.ToString("yyyy-MM-dd 00:00:00.000");
                DateTime dtStartDate = DateTime.ParseExact(sStartTime, "yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture);

                string sEndTime = dEndDate.AddDays(1).ToString("yyyy-MM-dd 00:00:00.000");
                DateTime dtEndDate = DateTime.ParseExact(sEndTime, "yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture);



                var query1 =
                    (from k in myContext.AdmVisits


                // Logic to pull population count subset
                     join tm in (
                         (from k2 in myContext.AdmVisits
                          where
                       (dStartDate <= k2.ServiceDateTime && k2.ServiceDateTime < dEndDate) && // DATE PARAMETERS
                           k2.UnitNumber != null &&
                           k2.BirthDateTime != null
                          group k2 by new
                          {
                              k2.Name,
                              k2.BirthDateTime,
                              k2.UnitNumber
                          } into g
                          select new
                          {
                              g.Key.Name,
                              g.Key.BirthDateTime,
                              g.Key.UnitNumber,
                              MaxDate = (DateTime?)g.Max(p => p.ServiceDateTime)
                          }))
                           on new { k.ServiceDateTime, k.UnitNumber }
                       equals new { ServiceDateTime = tm.MaxDate, tm.UnitNumber }


                  // This is a LEFT JOIN that cost issue. I've tried everything on Google but still couldn't get it to work. Please help.
                     join ip_inpt_admit in (
                         (from k1 in myContext.AdmVisits
                          where
                       (dStartDate <= k1.ServiceDateTime && k1.ServiceDateTime < dEndDate) && // DATE PARAMETERS
                           k1.InpatientOrOutpatient == "I"
                          group k1 by new
                          {
                              k1.UnitNumber
                          } into g
                          select new
                          {
                              get_count = g.Count(),
                              g.Key.UnitNumber
                          })) on k.UnitNumber equals ip_inpt_admit.UnitNumber into ip_inpt_admit_join
                     from ip_inpt_admit in ip_inpt_admit_join.DefaultIfEmpty()
                                                                                                  
                                                                                                                                                                                                  

                // Selected Columns
                     select new
                     {
                         MRN = (k.UnitNumber ?? ""),
                         INPT_ADMIT = ip_inpt_admit.get_count
                     }).Distinct().ToList();
                                                                                

                // PRINT HEADER
                tw.WriteLine("MRN|" +
                             "INPT_ADMIT"
                             );

                foreach (var e in query1)
                {

                // PRINT Column values
                    tw.WriteLine($"{e.MRN}|" +
                                 $"{e.INPT_ADMIT}");

                }

            }


        } 
    }
}

使用DefaultIfEmpty()進行所需的收集。 MSDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM