Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ2实体包括跳过/加载问题_C#_Entity Framework_Linq To Entities - Fatal编程技术网

C# LINQ2实体包括跳过/加载问题

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); 注意-始终提供排序顺序 最初,包含

注意:我知道关于Linq的问题有很多问题。包括(表)未加载数据,我相信我已经用尽了人们列出的选项,仍然存在问题

我在维护的应用程序上有一个大型查询。查询是这样建立的:

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解析器中存在错误
  • 我认为在您能够捕获生成的SQL并自己运行它之前,您不会在这方面取得更多进展。这其实并不难,因为您可以使用适当的过滤器设置SQL探查器。如果您发现生成的SQL在错误的情况下是不同的,那么您可以从那里向后工作。如果您发现生成的SQL在错误情况下是相同的,那么下一步将是查看返回的行,最好是在与运行它的应用程序相同的上下文中


    简而言之,我认为您只需不断调整SQL分析,直到获得所需的信息。

    对不起,L2E…不知道我为什么要编写L2SQL!那么,您是说SQL对于工作查询请求和失败的查询请求是一样的?不幸的是,当我有数据存在此问题时,成功的查询是非常零星的,我还没有设法在探查器中捕获SQL进行比较。然而,我没有理由怀疑它会有所不同,因为在没有代码更改或谓词更改的情况下观察到了这一点。当有疑问时,假设您的代码/数据是错误的,而不是您的工具。谢谢Craig。我非常同意最有可能的答案是我的数据。有趣的是,目前我已经解决了这个问题,将查询枚举到一个列表中,然后对列表进行跳过和接受。这很好用…不确定这对问题意味着什么!在接下来的几天里,我将尝试分析好的/坏的查询,我原则上同意这是最好的选择,但可怕的是,生成的sql有2000行长。有人为我想的工作选错了工具P2000行?耸肩它应该只在参数上有所不同,对吗?如果没有,您可能发现了问题。。。。