我有两个表:
User
-----------------
ID int
Name varchar
UserStatus
-----------------
ID int
UserId int
Status varchar
ActiveDate datetime
EndDate datetime
在C#中使用Linq,如果最大活动日期和结束日期为空,我将如何从用户表中获得所有信息,以及从用户状态表中获取所有列?
我知道下面的不起作用,但这是我尝试做什么的一个基本例子
ctx.Users.Include("UserStatus").Where(s => s.UserStatus.Max(t => t.ActiveDate) & s.UserStatus.EndDate != null).OrderBy(s => s.Name)
感谢
编辑
假设用户表有以下内容:
1 Billy Bob
2 Bilbo baggins
并且用户状态表具有:
1 1 Active 1/1/2011 null
2 1 Reserved 1/1/2011 3/5/2011
3 2 Active 2/22/2011 null
我想要以下结果:
1 Billy Bob Active 1/1/2011
2 Bilbo Baggins Active 2/22/2011
试着分两部分来做。首先,按分组并设置最大值(使用let
关键字),然后使用该值进行比较,最后选择对象。
var query = (from user in ctx.Users
join userStatus in ctx.UserStatuses on user.ID equals userStatus.User.ID
where userStatus.EndDate == null
group userStatus by new
{
userStatus.User.ID,
userStatus.ActiveDate
} into userGroup
let maxActiveDate = userGroup.Max(x => x.ActiveDate)
from userStatus in userGroup
where userStatus.ActiveDate == maxActiveDate
select new
{
userStatus.User.ID,
userStatus.User.Name,
userStatus.Status,
userStatus.ActiveDate
});
您可以使用这样的东西:
public IEnumerable<UserStatus> GetUsers(string name)
{
var query = (from u in db.User
join us in db.UserStatus on u.ID equals us.ID
where u.Name == name
orderby us.ActiveDate descending
select us)
as IEnumerable<UserStatus>;
return query;
}
或者,如果您只想要一条带有MAX ActiveDate的记录,您可以保留相同的linq语句,但使用。First(),您也可以将返回类型更改为仅DateTime等。
ctx.Users.Where(u => u.UserStatus.Max(us => us.ActiveDate) && u.UserStatus.EndDate.HasValue())
.OrderBy(u => u.Name)
这似乎是您想要的
如果你正在寻找每个没有结束日期的条目(因此是活动的),那么你可以使用
Where(x => x.UserStatus.EndDate == null)
在你的例子中,我看不出最长日期的必要性。