Вы писали:
Мне нужно сгруппировать их по электронной почте, и из этого мне нужно получить минимальное 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, так что он содержит также эти другие поля.
Это подробно объясняется в VB6 руководство по Иерархия обработки ошибок . On Error Goto 0
отключает обработчик ошибок в текущей процедуре , а не в вызывающих ее процедурах.
Если в процедуре возникает ошибка и эта процедура не включена обработчик ошибок, поиск в Visual Basic назад через ожидание процедуры в списке вызовов - и выполняет первый включенный обработчик ошибок он находит. Если оно не обнаружена ошибка обработчик в любом месте списка вызовов, это представляет неожиданную ошибку по умолчанию сообщение и останавливает выполнение.
Как уже говорили другие, вы можете перейти на вкладку Tools-Options-General и выбрать Break на всех ошибках . Это эффективно отключает все ваши операторы On Error - среда IDE немедленно ломается при каждой ошибке.
Это может раздражать, если ваш код VB6 выдает ошибки как часть нормальной работы. Например, когда вы проверяете, существует ли файл, или когда пользователь нажимает кнопку отмены в обычном диалоге. Вы не хотите, чтобы IDE каждый раз ломалась в этих строках. Но у вас могут быть стандартные обработчики ошибок во всех ваших процедурах обработки событий, чтобы предотвратить сбой программы при непредвиденных ошибках. Но они доставляют неудобства, когда вы отлаживаете проблемы, потому что среда IDE не ломается в строке с ошибкой. Одна хитрость заключается в том, чтобы отключить эти обработчики ошибок при работе в IDE, но держите их во встроенном исполняемом файле. Вы делаете это так.
Перетащите эти функции в модуль.
Public Function InIDE() As Boolean
Debug.Assert Not TestIDE(InIDE)
End Function
Private Function TestIDE(Test As Boolean) As Boolean
Test = True
End Function
Затем вы можете написать свои обработчики ошибок следующим образом.
Private Sub Form_Load()
If Not InIDE() Then On Error Goto PreventCrashes
<lots of code>
Exit Sub
PreventCrashes:
<report the error>
End Sub
Здесь здесь . Другой совет - используйте бесплатную надстройку MZTools для автоматического добавления этих стандартных обработчиков ошибок. Что касается кода производственного качества, вы можете пойти дальше и добавить обработчик ошибок в каждую подпрограмму для создания трассировки стека гетто . Вы также можете сразу регистрировать ошибки в каждом обработчике ошибок.
РЕДАКТИРОВАТЬ: Ant правильно указал, что On Error Goto -1
является оператором VB.Net и не допустимо в VB6.
РЕДАКТИРОВАТЬ: Arvo и OneNerd написали ответы с интересным обсуждением эмуляции, наконец, разделительных блоков в обработке ошибок VB6.
Существует простой и понятный способ сброса состояния ошибки - используйте ключевое слово Resume. Существует три возможности:
Resume
Resume Next
Resume <Label>
Resume продолжает выполнение в строке с ошибкой, Resume Next в следующей строке и наименее обсуждаемая метка Resume продолжается в метке. Очень полезно для создания конструкций типа try-catch-finally в VB6. Заимствовано и изменено из ответа OneNerd:
Function MyFunction() as String
'-- start of error block
'
On Error Goto Catch
' do something here that might cause an error
MyFunction = "IT WORKED"
Goto Finally
Catch:
' error occured - do something else
MyFunction = Err.Description
Err.Clear
Resume Finally ''added to clear error status
Finally:
On Error Resume Next ''added to avoid repeated errors
' put your finally code here
'
'-- end of error block
End Function
Простой Err.Clear не помогает, если в блоке «Наконец» возникает какая-то последующая ошибка; Resume Наконец сбрасывает состояние внутренней ошибки.
Есть удобное контекстное меню, которое позволяет включать и выключать обработку ошибок. Просто щелкните правой кнопкой мыши на окне кода и выберите Toggle, затем вы можете выбрать «Разбить все ошибки». Это приведет к отключению всех ваших операторов «On Error».
Вот что я делаю:
Сначала включите обработку ошибок, как это, если необходимо, в вашем Sub Main () или Sub Form_Load () Sub:
'-- turn on error handling
'
On Error GoTo 0
'
'-------------------------
Теперь ошибки будут включены.
Далее, используйте On Error Resume Next и При ошибке Команды GoTo {label} в сочетании с объектом Err . Вот пример эмуляции try / catch / finally:
Function MyFunction() as String
'-- start of error block
'
On Error Goto Catch
' do something here that might cause an error
MyFunction = "IT WORKED"
Goto Finally
Catch:
' error occured - do something else
MyFunction = Err.Description
Err.Clear
Finally:
' put your finally code here
'
'-- end of error block
End Function
on error goto 0
Должно быть то, что вы хотите ... Это должно вызвать ошибку к броску, и в свою очередь, вероятно, раскрутить до RTL ...
Это было давно, но я уверен, что это то, что вы хотите.
on error resume next
просто перейдет к следующему утверждению, поэтому вам НУЖНО иметь в своем коде множество операторов
if err.Number <> 0 then
где ошибки МОГУТ произойти ...
Необходимо согласиться с LarryF, При ошибке Перейти к 0 следует отключить явную обработку ошибок, которая был включен On Error Resume Next . Хотя функции и подпрограммы имеют свои собственные возможности для этого. От д-р. Скрипт в Microsoft :
Возобновление ошибки при следующем на начало сценария, как мы часто делает, это относится ко всему телу сценария. Но, как мы увидим в более поздние примеры, его объем не включить функции или подпрограммы. Если вы хотите обрабатывать ошибки в функция или подпрограмма, вы также должны включить по ошибке возобновить далее в каждом из них перед проверкой Err объект.
Вы можете отключить обработку ошибок с помощью При ошибке GoTo 0. Так что возможно включить обработку ошибок с помощью On Error Возобновить Далее, прежде чем вы хотите проверьте объект Err и выключите его после с On Error GoTo 0.
There is no "On Error GoTo -1" so I have no idea where you got that.
VB6 exception handling is covered very thoroughly in the manual.