我有一个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创建的。
答案 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);
}
}
这样它会在每次尝试使用它之后处理你的连接,否则它将在内存中保留一段时间。因为这段时间取决于垃圾收集器,所以它可能是它工作一段时间而不是其他工作的原因。尝试一下,让我知道它是否解决了你的问题。