[英]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.