Поиск МАКСИМАЛЬНОЙ даты в соединении запросов LINQ

#c# #linq #asp.net-mvc-3 #linq-to-sql

#c# #linq #asp.net-mvc-3 #linq-to-sql

Вопрос:

Пожалуйста, извините за недостаток знаний по этому вопросу, поскольку этот вопрос довольно простой, но у меня есть столбец с нулевым значением [DateTime], и я хотел бы использовать запрос LINQ для выбора записей для каждого пользователя с максимальной «меткой времени», найденной с помощью соединения.

Вот мой запрос на данный момент.

 return (from t1 in db.BU
                from t2 in db.UserNames
                 .Where(t => (t.User_Username == t1.Username))
                from t3 in db.Logins
                .Where(t => (t.username == t1.Username))
                where myBusinessUnits.Contains(t1.BusinessUnit_ID)
                orderby (t2.Name) descending
                select new GlobalMyTeamDetailModel
                {
                     LastLogin = t3.timestamp,
                     Name = t2.Name

                });
  

Если кто-нибудь может мне помочь, я был бы признателен.

Это максимальное значение таблицы «Login», которое я пытаюсь получить для каждого пользователя.

РЕДАКТИРОВАТЬ: еще одна попытка, которая не дала желаемого результата:

         var result =
           (from t1 in db.LoginHistories
            where t1.username == user

            from t2 in db.UserNames
                .Where(t => (t.User_Username == t1.username))

            from t3 in db.UserBusinessUnits
                .Where(t => (t.Username == t1.username))

            where myBusinessUnits.Contains(t3.BusinessUnit_ID)

            group t1 by new { t1.username } into g
            let MaxDate = g.Max(uh => uh.timestamp)

            select new GlobalMyTeamDetailModel
                {
                    LastLogin = MaxDate,
                    Name = g.Key.username
                });
  

Комментарии:

1. Вам действительно нужно объединить эти таблицы? Вы можете просто получить последние логины из таблицы Logins, сгруппировав в ней столбец username.

2. Я попробовал что-то другое и добавил это в вопрос. Он по-прежнему возвращает все записи. Можете ли вы порекомендовать?

Ответ №1:

если у вас всегда есть хотя бы строка соединения, отсортируйте t3 по метке времени и извлеките первую (должно быть наибольшее значение).

 return (from t1 in db.BU
            from t2 in db.UserNames
             .Where(t => (t.User_Username == t1.Username))
            from t3 in db.Logins
            .Where(t => (t.username == t1.Username))
            .OrderBy(u => u.timestamp).First()           // <--------- add this
            where myBusinessUnits.Contains(t1.BusinessUnit_ID)
            orderby (t2.Name) descending
            select new GlobalMyTeamDetailModel
            {
                 LastLogin = t3.timestamp,
                 Name = t2.Name

            });
  

Комментарии:

1. Спасибо за ответ, но это приводит к тому, что «Выражение типа ‘Login’ не разрешено в последующем предложении from в выражении запроса с исходным типом IQueryable<Anonymous> . Сбой интерфейса типа при вызове SelectMany() »

Ответ №2:

используйте group by и max в linq, как показано ниже

  From p In db.Products _
            Group p By p.CategoryID Into g = Group _
            Select New With {g, .MaxPrice = g.Max(Function(p) p.UnitPrice)}