C#Linq选择两个表,从一个表中选择MAX日期

本文关键字:选择 一个 日期 MAX 两个 C#Linq | 更新日期: 2023-09-27 17:57:44

我有两个表:

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

C#Linq选择两个表,从一个表中选择MAX日期

试着分两部分来做。首先,按分组并设置最大值(使用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)

在你的例子中,我看不出最长日期的必要性。