我在Stackoverflow上经历了很多问题,我担心我仍然无法找到答案。我正在使用实体框架。使用LINQ我试图找到过去七天中最受欢迎的课程。我有四个表参与查询,计划,会话,位置和联结表ClientSesions
附表的模型是
public class Schedule{
public Guid ScheduleID { get; set; }
public Guid CompanyID { get; set; }
public Guid LocationID { get; set; }
public Guid SessionID { get; set; }
public Guid SessionTypeID { get; set; }
public Guid ParentScheduleID { get; set; }
public int ClassDay { get; set; }
public int ClassMonth { get; set; }
public int ClassYear { get; set; }
public string Day { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public DateTime ClassDate { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public bool Deleted { get; set; }
public int SessionSize { get; set; }
public virtual Session Session { get; set; }
public virtual Company Company { get; set; }
public virtual Location Location { get; set; }
public virtual SessionType SessionType { get; set; }
}
会话模型
public class Session {
public System.Guid SessionID { get; set; }
public System.Guid ProgramID { get; set; }
public System.Guid CompanyID { get; set; }
public Nullable<Guid> SessionTypeID { get; set; }
public Int32 SessionSize { get; set; }
public bool Display { get; set; }
public virtual ClientSession ClientSession { get; set; }
}
Junction ClientSession表
public class ClientSession
{
public Guid ClientID { get; set; }
public Guid CompanyID { get; set; }
public Guid SessionID { get; set; }
public Nullable<System.Guid> TransactionID { get; set; }
// Navigation Properties
public virtual Client Client { get; set; }
public virtual Session Session { get; set; }
}
我编写了以下SQL代码,它按预期工作,但我担心我没有足够的知识或经验将其转换为Linq。
SELECT TOP 1 s.ClassDate, l.LocationName, COUNT(c.SessionID) as num_att
FROM Schedules s
JOIN Sessions ss ON s.SessionID = ss.SessionID
JOIN Sessions ss ON s.SessionID = ss.SessionID
JOIN ClientSessions c ON ss.SessionID = c.SessionID
JOIN Locations l ON s.LocationID = l.LocationID
WHERE s.CompanyID = '109'
AND s.LocationID = '4'
AND (s.ClassDate >= DATEADD(DAY, -7, GETDATE()))
GROUP BY s.ClassDate, l.LocationName
ORDER BY num_att DESC, s.ClassDate DESC
这是我设法得到的
var details = _repositoryBase.AllIncluding<Schedule>(x => x.Session, x => x.Location)
.Where(x => x.CompanyID == mostPopularSessionRequest.CompanyID
&& x.LocationID == mostPopularSessionRequest.LocationID
.GroupBy(x => x.ClassDate)
向我展示如何完成其余部分的任何帮助都将非常感激。
提前感谢任何帮助。
答案 0 :(得分:0)
var query = from s in Schedules
join ss in Schedules on s.SessionID equals ss.SessionID
join c in ClientSessions on ss.SessionID equals c.SessionID
join l in Locations on s.LocationID equals l.LocationID
where s.CompanyID = 109 && s.LocationID = 4 && (s.ClassDate >= DateTime.Now.AddDays(-7))
group c by new
{
c.ClassDate,
l.LocationName
} into gcs
select new
{
ClassDate = gcs.Key.ClassDate,
LocationName = gcs.Key.LocationName,
SessionIDCount = gcs.c.Count()
};