另一个 System.InvalidOperationException: Sequence contains no elements(使用 .Any())

4

在这一行代码上出现了异常:

public bool isEngageOn()
    {
line 149  -> return chatUserRepository.Table.Where(c => c.TrackingOn).Any();
    }

TrackingOn 是布尔类型。

.Any() 应该是用来 "确定序列是否包含任何元素",那么为什么 Elmah 抛出了 "System.InvalidOperationException 序列中不包含任何元素" 异常呢?

错误:

System.InvalidOperationException: Sequence contains no elements
 at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
 at System.Linq.Queryable.Any[TSource](IQueryable`1 source)
 at sf2015.Models.DomainModels.Services.ChatServices.isEngageOn() in C:\....\ChatServices.cs:line 149

p.s.: 无法重现错误,但有时会在Elmah错误日志中显示。

以下是存储库的一些代码

public virtual IQueryable<T> Table
    {
        get
        {
            return this.Entities;
        }
    }

    private DbSet<T> Entities
    {
        get
        {
            if (_entities == null)
                _entities = Context.Set<T>();
            return _entities;
        }
    }

你能发几行前面的代码吗? - Joachim Isaksson
@Joachim Isaksson,请查看更新的问题并告诉我是否足够。 - Joao Leme
3
你使用的查询提供程序是哪个?似乎查询提供程序搞砸了一些东西。 - Servy
1
我已经添加了 elmah 标签。如果您无法重现错误,并且它仅在 elmah 日志中显示,也许对 elmah 有很好了解的人会有想法。 - Slauma
所有 isEngageOn() 实例的代码都在这里吗? - Jodrell
显示剩余8条评论
3个回答

0

您提供的堆栈跟踪显示异常来自.Single,如果未找到任何元素,则会引发所述异常。您可以将所述代码更改为:

 return chatUserRepository.Table.Any(c => c.TrackingOn);

这将执行与您的代码行相同的操作。


所以你的意思是@Joachim Isaksoon上面的评论是错误的(不是一样的)。我之前改过代码,没有在Elmah上看到错误消息(除了最近没有花太多时间查看Elmah错误),所以我猜可能已经解决了。谢谢。我会将Jordan的回答设置为正确答案,如果以后发现有问题再做处理。 - Joao Leme
@joaoleme 它可能会执行相同的操作(并且很可能会),但它是否执行取决于集合类型的实现细节。然而,这已经不是重点了。简化版本更像英语,因此有助于理解意图。当然,这是我个人的偏好。 - Rune FS

0

正确的使用方法是:

return chatUserRepository.Table.Any(c => c.TrackingOn)


12
原查询将执行相同的数据库查询并完全相同,使用另一种语法编写相同的查询并不是对他问题的回答。 - Joachim Isaksson
1
感谢乔丹指出这个问题。下次可以省去我一些打字。 - Joao Leme

0

我曾经遇到过完全相同的问题。

我使用了Any()方法,但是StackTrace显示Single()方法出错。

问题的原因是Entity Framework Code First Configuration类中的Seed()方法。

我的Seed()方法在一个没有记录的表上使用了Single()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接