我有以下LINQ查詢,即返回我期望的結果,但它不「感覺」正確。這是LINQ查詢「正確」嗎?
基本上它是一個左連接。我需要UserProfile表中的所有記錄。
然後LastWinnerDate是來自勝出者表(可能的多個記錄)的單個記錄,指示DateTime最後一條記錄在該表中爲用戶輸入。
WinnerCount是獲勝者表中用戶的記錄數(可能有多個記錄)。
Video1基本上是一個布爾值,表示在第三個表上匹配的勝者表中的用戶存在或不是記錄目標(應該是1行或0行)。
Quiz1與視頻1匹配來自Objective Table的另一條記錄(應該是1行或0行)。
視頻和測驗重複了12次,因爲它是向用戶顯示報告,列出所有用戶記錄並指出他們是否達到了目標。
var objectiveIds = new List<int>();
objectiveIds.AddRange(GetObjectiveIds(objectiveName, false));
var q =
from up in MetaData.UserProfile
select new RankingDTO
{
UserId = up.UserID,
FirstName = up.FirstName,
LastName = up.LastName,
LastWinnerDate = (
from winner in MetaData.Winner
where objectiveIds.Contains(winner.ObjectiveID)
where winner.Active
where winner.UserID == up.UserID
orderby winner.CreatedOn descending
select winner.CreatedOn).First(),
WinnerCount = (
from winner in MetaData.Winner
where objectiveIds.Contains(winner.ObjectiveID)
where winner.Active
where winner.UserID == up.UserID
orderby winner.CreatedOn descending
select winner).Count(),
Video1 = (
from winner in MetaData.Winner
join o in MetaData.Objective on winner.ObjectiveID equals o.ObjectiveID
where o.ObjectiveNm == Constants.Promotions.SecVideo1
where winner.Active
where winner.UserID == up.UserID
select winner).Count(),
Quiz1 = (
from winner2 in MetaData.Winner
join o2 in MetaData.Objective on winner2.ObjectiveID equals o2.ObjectiveID
where o2.ObjectiveNm == Constants.Promotions.SecQuiz1
where winner2.Active
where winner2.UserID == up.UserID
select winner2).Count(),
};
哪一部分不_feel right_ =) – gideon 2011-03-24 14:19:56
嘗試[代碼審查(http://codereview.stackexchange.com/ ) – 2011-03-24 14:20:10
我如何完成左連接。我仍然在學習LINQ,而在T-SQL中,我只是在查詢的主要部分寫入JOINS ... – Schenz 2011-03-24 14:21:40