我有以下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