Я бы попробовал использовать другой метод, возможно, избегая методов расширения linq Enumerable
. Разве класс UserActivations
не имеет собственного метода или свойства, чтобы определить, сколько элементов содержит экземпляр?
В любом случае не следует использовать метод расширения Count()
для проверки того, является ли последовательность пустой, поскольку она будет перечислять всю последовательность (если последовательность не реализует ICollection
). Или, как отметил Павел Гатилов, если объект реализует IQueryable
, Count может неожиданно выполнить запрос к базе данных.
Это не имеет большого значения здесь, где вы ожидаете иметь один элемент, но это может быть очень важно в тех случаях, когда последовательность может регулярно иметь тысячи элементов. Вместо этого вы должны использовать метод расширения Any()
.
Поскольку использование Any()
, вероятно, ничего не изменит с точки зрения анализатора контрактов, тем не менее, вам следует использовать свойство Count
класса UserActivations (если, например, оно реализует ICollection).
Возможно, вы можете помочь анализатору контрактов следующим образом:
private static UserActivation GetUserActivation(Guid userId)
{
UserActivations userActivations = UserActivation.GetUserActivationsByUser(userId: userId);
IEnumerable<UserActivation> e = (IEnumerable<UserActivation>)userActivations;
Contract.Assume(e != null);
if (e.Count() > 1) // Line Number 161
throw new Exception("More then one user action found in database");
return userActivations[0];
}
Лучшим решением, если вы управляете классом UserActivations
, было бы добавить Contract.Ensures
к GetUserActivationsByUser
, чтобы сказать, что метод никогда не вернет ноль.