C# LINQ2实体包括跳过/加载问题
注意:我知道关于Linq的问题有很多问题。包括(表)未加载数据,我相信我已经用尽了人们列出的选项,仍然存在问题 我在维护的应用程序上有一个大型查询。查询是这样建立的:C# LINQ2实体包括跳过/加载问题,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,注意:我知道关于Linq的问题有很多问题。包括(表)未加载数据,我相信我已经用尽了人们列出的选项,仍然存在问题 我在维护的应用程序上有一个大型查询。查询是这样建立的: IQueryable<Results> query = context.MyTable .Where(r => r.RelatedTable.ID == 2 && r.AnotherRelatedTable.ID == someId); 注意-始终提供排序顺序 最初,包含
IQueryable<Results> query = context.MyTable
.Where(r =>
r.RelatedTable.ID == 2 &&
r.AnotherRelatedTable.ID == someId);
注意-始终提供排序顺序
最初,包含的表格是在阅读了《名人》等文章之后在开始时设置的,因此现在它们在结尾处完成(这并没有解决问题):
var resultsList=(query.Select(r=>r)作为ObjectQuery)
.包括(“相关表”)
.包括(“其他相关表格”)
.Skip((第1页)*行页面)
.采取(划船)行动;
似乎是随机的(大约每5000个站点用户,这个问题就会发生一次),相关数据不会加载。可以通过调用相关表上的load来强制执行。但即使加载失败也不一致,我已经在测试中运行了该查询,并且它是有效的,但大多数时间没有,没有更改任何代码或数据
如果不包括跳过和执行,并且返回整个数据集,这很好,但我希望跳过和执行操作可以在完整的数据集上完成-它显然是从分析SQL开始的
2010年11月16日更新:我已经针对一个问题数据集分析了SQL,我已经能够重现失败的查询大约9/10次,但其余的都成功了。当查询失败或成功时,正在执行的SQL是相同的,但传递给SQL的参数除外
这个问题已经通过以下改变得到了解决,但问题仍然是为什么要这样做
失败-获取LINQ以处理行:
var resultsList = (query.Select(r => r) as ObjectQuery<Results>)
.Include("RelatedTable")
.Include("AnotherRelatedTable")
.Skip((page - 1) * rowsPerPage)
.Take(rowsPerPage)
.ToList();
var resultsList = (query.Select(r => r) as ObjectQuery<Results>)
.Include("RelatedTable")
.Include("AnotherRelatedTable")
.ToList()
.Skip((page - 1) * rowsPerPage)
.Take(rowsPerPage);
var resultsList=(query.Select(r=>r)作为ObjectQuery)
.包括(“相关表”)
.包括(“其他相关表格”)
.Skip((第1页)*行页面)
.Take(rowsPerPage)
.ToList();
工作-枚举数据,然后获取行:
var resultsList = (query.Select(r => r) as ObjectQuery<Results>)
.Include("RelatedTable")
.Include("AnotherRelatedTable")
.Skip((page - 1) * rowsPerPage)
.Take(rowsPerPage)
.ToList();
var resultsList = (query.Select(r => r) as ObjectQuery<Results>)
.Include("RelatedTable")
.Include("AnotherRelatedTable")
.ToList()
.Skip((page - 1) * rowsPerPage)
.Take(rowsPerPage);
var resultsList=(query.Select(r=>r)作为ObjectQuery)
.包括(“相关表”)
.包括(“其他相关表格”)
托利斯先生()
.Skip((第1页)*行页面)
.采取(划船)行动;
不幸的是,这个查询创建的SQL包含一些敏感的模式数据,所以我不能发布它,它也有1400行长,所以我不会让公众接受它 Take()的唯一作用是更改生成的SQL。除此之外,实体框架根本不关心它。与
.Skip()
相同。很难相信这会对查询物化产生影响(尽管发生了一些奇怪的事情)
那么是什么导致了这种行为呢?不经意间:
简而言之,我认为您只需不断调整SQL分析,直到获得所需的信息。对不起,L2E…不知道我为什么要编写L2SQL!那么,您是说SQL对于工作查询请求和失败的查询请求是一样的?不幸的是,当我有数据存在此问题时,成功的查询是非常零星的,我还没有设法在探查器中捕获SQL进行比较。然而,我没有理由怀疑它会有所不同,因为在没有代码更改或谓词更改的情况下观察到了这一点。当有疑问时,假设您的代码/数据是错误的,而不是您的工具。谢谢Craig。我非常同意最有可能的答案是我的数据。有趣的是,目前我已经解决了这个问题,将查询枚举到一个列表中,然后对列表进行跳过和接受。这很好用…不确定这对问题意味着什么!在接下来的几天里,我将尝试分析好的/坏的查询,我原则上同意这是最好的选择,但可怕的是,生成的sql有2000行长。有人为我想的工作选错了工具P2000行?耸肩它应该只在参数上有所不同,对吗?如果没有,您可能发现了问题。。。。