C # Linq Выберите две таблицы выберите MAX дату из одной - PullRequest
1 голос
/ 24 мая 2011

У меня есть две таблицы:

User
-----------------
ID       int
Name     varchar

UserStatus
-----------------
ID          int
UserId      int
Status      varchar
ActiveDate datetime
EndDate    datetime

Используя Linq в C #, как мне получить всю информацию из таблицы User и все столбцы из таблицы состояния пользователя по максимальной активной дате и дате окончания?null?

Я знаю, что следующее не сработает, но это своего рода примитивный пример того, что я пытаюсь сделать.

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 ]

4 голосов
/ 25 мая 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
    });
2 голосов
/ 24 мая 2011

Вы можете использовать что-то вроде этого:

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 и т. д.

1 голос
/ 24 мая 2011
ctx.Users.Where(u => u.UserStatus.Max(us => us.ActiveDate) && u.UserStatus.EndDate.HasValue())
    .OrderBy(u => u.Name)

это похоже на то, что вы хотите

1 голос
/ 24 мая 2011

Если вы ищете каждую запись, которая НЕ имеет конечной даты (следовательно, активна), то вы можете просто использовать

Where(x => x.UserStatus.EndDate == null)

Я не вижу необходимости в максимальной дате в ваших примерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...