[英]Converting an SQL with Left Join , Group and Sum to a Linq Query
我正在嘗試在 C# 和 Linq 中復制以下 SQL,但我對 Z7FB528B61118DFE304CA Beyonds88 基礎知識不太有經驗。
SELECT SUM(coalesce(cd.minutesspent,0))
FROM timelabels t
LEFT JOIN challengedetails cd on cd.createddate = t.date
GROUP BY t.date
這會給我每個日期的分鍾總和,如果有 null 條目,則為零。 我覺得很簡單。
// timelabels structure
DateTime start = DateTime.Now.AddDays(-14);
DateTime end = DateTime.Now;
List<DateTime> timelabels = new List<DateTime>();
for (var dt = start; dt <= end; dt = dt.AddDays(1))
{
timelabels.Add(dt);
}
// ChallengeDetails structure & sample data
class ChallengeDetails(){
DateTime? Createddate
int? MinutesSpent
}
List<ChallengeDetails> ChallengeDetails = new List<ChallengeDetails >();
List<ChallengeDetails> ChallengeDetails = new List<ChallengeDetails>();
ChallengeDetails.Add(new ChallengeDetails { MinutesSpent = 44, Createddate = DateTime.Now.AddDays(-10) });
ChallengeDetails.Add(new ChallengeDetails { MinutesSpent = 31, Createddate = DateTime.Now.AddDays(-7) });
ChallengeDetails.Add(new ChallengeDetails { MinutesSpent = 13, Createddate = DateTime.Now.AddDays(-3) });
ChallengeDetails.Add(new ChallengeDetails { MinutesSpent = 77, Createddate = DateTime.Now.AddDays(-2) });
// The Actual Code
List<string> timedata = (from a in timelabels
join al in ChallengeDetails on a equals al.Createddate into All
from al in All.DefaultIfEmpty()
group al by a into grouped
select grouped.Sum(m => m.MinutesSpent ?? 0).ToString()
).ToList();
看看這個它應該可以工作 - 我有 DefaultIfEmpty 應該復制左連接。 在總和內我有'?? 0' 這應該是沒有 ChallengeDetail 的任何日期的后備。
但我得到 System.NullReferenceException:'對象引用未設置為 object 的實例。 m 是 null。 我不應該得到這個,因為我已經覆蓋了 null 條目,還是我把這一切都弄錯了?
在“實際代碼”部分下,只需在 Sum function 中添加一個括號,如下所示它應該注意 null,甚至在 Sum 工作之前。
select grouped.Sum(m => (m.MinutesSpent ?? 0)).ToString()
這將為您做,使用 LINQ - Lambda 表達式:
var TotalMinutesSpentGroupedList = timelabels
.GroupJoin(challengedetails,
t => date,
cd => createddate,
(t,cd) => new
{
MinutesSpent = cd.minutesspent ?? 0,
CreateDate = cd.createddate ?? DateTime.Now
})
.SelectMany(tcd=> challengedetails.DefaultIfEmpty(),
(t, cd) => new
{
MinutesSpent = cd.minutesspent ?? 0,
CreateDate = cd.createddate ?? DateTime.Now
})
.Select(s => new
{
MinutesSpent = cd.minutesspent ?? 0,
CreateDate = cd.createddate ?? DateTime.Now
})
.GroupBy(g => g.createddate).Select(item => item.Sum(s => s.minutesspent));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.