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

时间:2011-05-24 14:41:21

标签: c# linq entity-framework

我有两张桌子:

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

4 个答案:

答案 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)

这看起来像你想要的