Хотя верно, что запрос регулярных выражений для синтаксического анализа произвольного HTML похож на прошение начинающему писать операционную систему, иногда бывает целесообразно проанализировать ограниченный , известный набор HTML.
Если у вас есть небольшой набор HTML-страниц, которые вы хотите очистить данные, а затем вложить в базу данных, регулярные выражения могут работать нормально. Например, недавно я хотел получить имена, партии и округа австралийских федеральных представителей, которые я сошел с веб-сайта парламента. Это была ограниченная одноразовая работа.
Regexes отлично справились со мной и были очень быстрыми, чтобы настроить.
Вы писали:
Мне нужно сгруппировать их по электронной почте, и из этого мне нужно получить минимальное login_time определенного email_id для текущей даты.
blockquote>Для этого я бы использовал Queryable.GroupBy с ElementSelector .
DateTime selectionDate = DateTime.UtcNow.Date; // or any other date you want to use var result = db.Logs // Keep only logs that have an e-mail on the selection date: .Where(log => log.LogInTime == selectionDate) // Group all remaining logs into logs with same email .GroupBy(log => log.email, // element selector: I only need the LoginTimes of the Logs log => log.LoginTime, // result selector: take the email, and all logInTimes of logs // with this email to make a new object (email, logInTimesForThisEmail) => new { Email = email, // only if desired in your end result // Order the loginTimes and keep the first, // which is the min login time of this email on this date MinLoginTimeOnDate = logInTimesForThisEmail .OrderBy(logInTime => loginTime) .FirstOrDefault(),
Ваш пример кода показывает, что вы также хотите максимальное время входа в систему на выбранную дату. Используйте отдельный Select, поэтому вам нужно будет упорядочить элементы только один раз:
(email, logInTimesForThisEmail) => new { Email = email, // only if desired in your end result LogInTimes = logInTimesForThisEmail .OrderBy(loginTime => loginTime); }) .Select(groupResult => new { Email = groupResult.Email, MinTime = groupResult.LogInTimes.FirstOrDefault(), MaxTime = groupResult.LogInTimes.LastOrDefault(), });
Если вам нужно больше полей, чем просто Email и LoginTimes, измените параметр
ElementSelector
GroupBy, так что он содержит также эти другие поля.
string date = DateTime.Today.Date.ToShortDateString();
var grouped = from a in db.Logs.ToList()
where a.date == date
group a by a.email
into g
let ordered = g.OrderBy(x => x.date).ToList()
let firstLogin = ordered.First()
let lastLogin = ordered.Last()
select new
{
first_login_time = firstLogin.login_time,
first_login = firstLogin.login,
last_login_time = lastLogin.login_time,
last_login = lastLogin.login
};
Страница просмотра администратора должна иметь только первый вход в систему и последний выход для определенного электронного письма на текущую дату.
blockquote>string date = DateTime.Today.Date.ToShortDateString(); var grouped = from a in db.Logs.ToList() where a.login.Date == date group a by a.email into g let firstLogin = g.OrderBy(x => x.login).First() // order by login time and get first let lastLogout = g.OrderBy(x => x.logout).Last() // order by lotgout time and get last select new { email: g.Key, first_login = firstLogin.login, // first login last_logout = lastLogin.logout // last logout };
Я надеюсь, что ваши поля
login
иlogout
имеют типdatetime
. Вы все еще не поняли вопрос. Когда я просил вас получить схему таблицы, я предполагал, что вы меня за что-то наподобие:CREATE TABLE [dbo].[Logs]( [username] [nvarchar](4000) NOT NULL, [email] [nvarchar](4000) NOT NULL, [login] [datetime] NULL, [logout] [datetime] NULL )
Или, возможно, объявление класса
public class Log { public string email {get; set; } public string username {get; set; } public DateTime login {get; set; } public DateTime logout {get; set; } }
Вы можете научиться задавать вопросы
Обновление 2
Предположим, у меня 3 разных адреса электронной почты. Если они обращались к моему заявлению, там регистрировалось время входа и выхода из системы.
blockquote>Table[Login_details] id employee date login logout email 1 ShobaBTM 2019-03-18 16:12 16:12 shobabtm@gmail.com 2 neymarjr 2019-03-18 16:22 16:22 neymar@gmail.com 3 Cristiano 2019-03-18 16:23 16:23 cr7@gmail.com 4 neymarjr 2019-03-18 16:25 16:25 neymar@gmail.com 5 neymarjr 2019-03-18 16:30 16:32 neymar@gmail.com 6 neymarjr 2019-03-18 16:42 16:45 neymar@gmail.com
В представлении администратора у меня должно быть это
blockquote>1 ShobaBTM 2019-03-18 16:12 16:12 2 Cristiano 2019-03-18 16:23 16:23 3 neymarjr 2019-03-18 16:25 16:45
Хорошо, попробуйте это:
string date = DateTime.Today.Date.ToShortDateString(); var grouped = from a in db.Logs.ToList() where a.date == date group a by new { a.employee, a.date } into g let firstLogin = g.OrderBy(x => TimeSpan.ParseExact(x.login, "hh\\:mm")).First() // order by login time and get first let lastLogout = g.OrderBy(x => TimeSpan.ParseExact(x.logout, "hh\\:mm")).Last() // order by logout time and get last select new { employee = g.Key.employee, date = g.Key.date, first_login = firstLogin.login, // first login last_logout = lastLogin.logout // last logout };
Это код Работа? Если нет - что именно происходит?