我有两张桌子:
User
-----------------
ID int
Name varchar
UserStatus
-----------------
ID int
UserId int
Status varchar
ActiveDate datetime
EndDate datetime
在C#中使用Linq如何从最大活动日期和结束日期为空来获取User表中的所有信息以及用户状态表中的所有列?
我知道以下内容不会奏效,但它是我想要做的一个基本的例子。
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
答案 0 :(得分:4)
尝试分两部分。首先,分组并设置最大值(使用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
});
答案 1 :(得分:2)
您可以使用以下内容:
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等等。
答案 2 :(得分:1)
如果您正在寻找没有结束日期(因此有效)的每个条目,那么您可以使用
Where(x => x.UserStatus.EndDate == null)
我认为您的示例中不需要最大日期。
答案 3 :(得分:1)
ctx.Users.Where(u => u.UserStatus.Max(us => us.ActiveDate) && u.UserStatus.EndDate.HasValue())
.OrderBy(u => u.Name)
这看起来像你想要的