【发布时间】:2025-11-23 02:10:01
【问题描述】:
我有一个 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% 的时间都在查询相同的数据库。我什至尝试过不同的网络主机——一旦上线,都会出现同样的故障。
membership 是一个字符串[],其中包含该成员所属的所有角色的列表。
Folder
- Id
- RingId
Ring
- Id
- Name (Nullable)
Tag
- Id
- Name
Key
- Id
- RingId
- TagId
Image
- Id
- FolderId
- RingId
这是基本的数据库结构设置。
现在,这个查询在我的本地机器上运行良好 - 在我的所有测试等中。但是当我把它上线时,它只是随机开始返回 null 有时。我找不到押韵或原因,它对一些请求运行良好,然后它就停止返回结果。
它返回的结果集非常大。我会说大约880个项目。每秒访问它的次数非常非常高。起初我想也许这只是有多少人访问它的压力。
我可以提供任何有助于调试的信息吗?还有一些与此类似的其他查询-我已经尝试过,尝试过,尝试过,但我根本无法在调试器中重现结果。我收到了各种各样的 InvalidCastException 调用——但从来没有任何强制转换。一切都以 IQueryable 的形式返回——除了接受 Guid 并从 ASP.NET Membership Provider 传递 Membership 数据外,视图没有做任何特别的事情——我已经检查并确认它正在工作。 (插入强制数据,而不是让提供者这样做 - 仍然失败)
我会尽力提供任何需要的信息,但我真的很沮丧——因为这对我来说毫无意义(为什么会失败)。
非常感谢您的宝贵时间。 (这一切都在 .NET 3.5、ASP.NET MVC 1.0、C# 中完成)- 对象是使用 LINQ to SQL 创建的。
【问题讨论】:
-
数据上下文是一次性的,你有什么理由不通过在 using 语句中包装它的生命周期来处理它?
-
我不熟悉这种做法。你建议以这种方式包装它吗?我自称是初学者。
-
将它包含在 using 语句中只会给我一个 System.ObjectDisposedException。返回在 using 语句中 - 如果我要处理数据上下文,我不确定如何从中获取数据。
标签: c# asp.net-mvc linq .net-3.5