Linq随机返回定期的null结果

时间:2010-02-17 23:13:05

标签: c# asp.net-mvc linq .net-3.5

我有一个linq查询,这无疑是相当大的。我无法确定它出错的地方,因为它只发生在远程服务器上,我无权调试它。但基本上就是这样......

此代码列出了当前成员可以看到的所有“文件夹”。 (文件夹包含图像。)

            if (membership == null || membership.Count() == 0)
                membership = new string[] { "Guests" };

            return DataContext.Folders.Where(f => f.Ring.Keys.Any(k => k.Tag.Id == id))
                .Where(i => i.Ring.Keys.Any(t => membership.Contains(t.Tag.Name))).OrderBy(n => n.Date).DefaultIfEmpty();

此代码列出了用户可以看到的所有“标签”(标签包含在环中,可以挂在文件夹或图像上)

        IQueryable<Models.Tag> tags = null;
        do
        {
            DataContext = new Models.Contexts.DatabaseDataContext();

            tags = null;
            if (membership == null)
                membership = new string[] { "Guests" };

            tags = DataContext.Tags.Where(t => t.Keys.Any(k => k.Ring.Name == category))
                .Where(t => t.Keys.Any(k => k.Ring.Keys.Any(c => membership.Contains(c.Tag.Name)))).OrderBy(o => o.Name);
        }
        while (tags == null || tags.Count() == 0);

        return tags;

我把它包含在一个do循环中,让我感到沮丧,看看它是否可以强制它实际保持调用,直到它不再为空。没有这样的运气,它仍然是空的。同样,这个完全相同的代码“有时”工作,100%的时间用于每次测试,查询SAME数据库。我甚至尝试过不同的网络主机 - 一旦它存在就会出现相同的故障。

成员资格是一个字符串[],其中包含该成员所属的所有角色的列表。

Folder
- Id
- RingId

Ring
- Id
- Name (Nullable)

Tag
- Id
- Name

Key
- Id
- RingId
- TagId

Image
- Id
- FolderId
- RingId

这是基本的数据库结构设置。

现在,这个查询在我的本地机器上运行正常 - 在我的所有测试中等等。但是当我把它放到现场时,它只是随机开始返回null 有时。我找不到押韵或原因,为一些请求运行正常,然后它就停止返回结果。

它返回的结果集非常大。我会说约880件物品。并且每秒访问的次数非常非常高。我一开始认为也许只是有多少人访问它的压力。

我可以提供哪些信息可能有助于调试此信息?还有一些类似于这个的其他查询 - 我已经尝试过,尝试过并尝试过,我根本无法在调试器中重现结果。我得到各种各样的InvalidCastException调用 - 但是从来没有任何转换。所有内容都以IQueryable的形式返回 - 除了接收Guids并从ASP.NET成员资格提供程序传递成员资格数据之外,视图不会做任何特殊操作 - 我已经检查过并确认它正在工作。 (插入强制数据,而不是让提供商这样做 - 仍然失败)

我会尝试提供所需的任何信息,但我真的感到沮丧 - 因为这对我来说没有任何意义(为什么它会失败)。

非常感谢你的时间。 (这完全在.NET 3.5,ASP.NET MVC 1.0,C#中完成) - 对象是使用LINQ to SQL创建的。

2 个答案:

答案 0 :(得分:1)

这听起来像是负载问题。在Web服务器上放置一些性能计数器并观察其使用情况。

答案 1 :(得分:1)

好的我不确定这是不是你的问题,但是在评论中写回来太难了,

假设您正在使用LINQ to SQL,您的数据上下文是一次性的。因此,当您想要使用它时,您可以将其包装在using语句中,如下所示:

    do
    {
        using (DataContext = new Models.Contexts.DatabaseDataContext())
        {

            tags = null;
            if (membership == null)
                membership = new string[] { "Guests" };

            tags = DataContext.Tags.Where(t => t.Keys.Any(k => k.Ring.Name == category))
                .Where(t => t.Keys.Any(k => k.Ring.Keys.Any(c => membership.Contains(c.Tag.Name)))).OrderBy(o => o.Name);
        }
    }

这样它会在每次尝试使用它之后处理你的连接,否则它将在内存中保留一段时间。因为这段时间取决于垃圾收集器,所以它可能是它工作一段时间而不是其他工作的原因。尝试一下,让我知道它是否解决了你的问题。