Как выбрать лучший результат для данного идентификатора, а затем объединить его в другую таблицу EF Core LINQ - PullRequest
0 голосов
/ 09 апреля 2020

Из-за жизни я не могу выбраться из этого.

У меня есть 2 таблицы в базе данных 1. Компьютеры 2. UserLogins

По сути, я пытаюсь получить последнюю запись для входа в систему из таблицы "UserLogins" и объединить ее с соответствующей запись в таблице «Компьютеры».

Это звучит достаточно просто, но я еще не изучил достаточное количество курсов LINQ / EF Core, чтобы понять, как это сделать правильно, кажется.

Вот некоторые SQL, которые я знаю, функции, как я ожидаю:

SELECT * FROM ComputerInfo 
LEFT JOIN (
    SELECT LoginID, UserID, l.ComputerName, IpAddress, l.LoginTime FROM UserLogins as l
    INNER JOIN (
    SELECT ComputerName, MAX(LoginTime) as LoginTime
    FROM UserLogins
    GROUP BY ComputerName) as max on max.ComputerName = l.ComputerName and max.LoginTime = l.LoginTime
    ) as toplogin on toplogin.ComputerName = ComputerInfo.ComputerName

Для справки, я собираюсь реализовать это в своем классе Controller.cs, и я использую: EF Core ( 3.1.2) ASP. NET Core (3.1)

У меня есть пара запросов, с которыми я экспериментировал, которые возвращают результаты, но я не могу присоединиться к ним без ошибок:

var computerQuery = _context.ComputerInfo
                    .OrderBy(on => on.ComputerName)

var userQuery = _context.UserLogins
                .Select(p => p.ComputerName)
                .Distinct()
                .Select(id => _context.UserLogins
                .OrderByDescending(p => p.LoginTime)
                .FirstOrDefault(p => p.ComputerName == id))
                .ToListAsync();

1 Ответ

0 голосов
/ 09 апреля 2020

Так что я нашел какой-то дурацкий способ сделать это, я думаю. Не уверен, что это правильно, но вот что я придумал:

Я создал новый класс с именем "ComputerInfoFull", который в основном был просто "ComputerInfo" && "UserLogins", и использовал его для запроса linq :

var initial = from computerInfo in _context.ComputerInfo
                          from userInfo in _context.UserLogins
                              .Where(o => o.ComputerName == computerInfo.ComputerName)
                              .OrderByDescending(o => o.LoginTime).Take(1)
                          select new ComputerInfoFull(computerInfo, userInfo);

Я очень уверен, что есть более чистый лямбда-способ написания этого, но я не могу понять, как заставить его работать правильно. Слишком много всего происходит для моего крошечного мозга, чтобы справиться с ним. Если у кого-то есть какие-либо идеи о том, как я могу сделать это чище, пожалуйста, дайте мне знать, чтобы я мог учиться.

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