Как мы выполняем групповые операции с данными, полученными из базы данных

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

Если у вас есть небольшой набор HTML-страниц, которые вы хотите очистить данные, а затем вложить в базу данных, регулярные выражения могут работать нормально. Например, недавно я хотел получить имена, партии и округа австралийских федеральных представителей, которые я сошел с веб-сайта парламента. Это была ограниченная одноразовая работа.

Regexes отлично справились со мной и были очень быстрыми, чтобы настроить.

0
задан ArunPratap 18 March 2019 в 09:56
поделиться

2 ответа

Вы писали:

Мне нужно сгруппировать их по электронной почте, и из этого мне нужно получить минимальное login_time определенного email_id для текущей даты.

Для этого я бы использовал 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, так что он содержит также эти другие поля.

0
ответ дан Harald Coppoolse 18 March 2019 в 09:56
поделиться
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        
    };

Обновление

Страница просмотра администратора должна иметь только первый вход в систему и последний выход для определенного электронного письма на текущую дату.

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 разных адреса электронной почты. Если они обращались к моему заявлению, там регистрировалось время входа и выхода из системы.

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

В представлении администратора у меня должно быть это

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
    };

Это код Работа? Если нет - что именно происходит?

0
ответ дан Alexander 18 March 2019 в 09:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: