C# LINQ到实体-子查询将分块返回?

C# LINQ到实体-子查询将分块返回?,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我有以下LINQtoEntities查询,其中有一个子查询。一切看起来都很好,数据似乎恢复到了应有的状态,但事实并非如此。子查询实际上以某种方式被分块。问题是: from pg in PhotoGroups join o in Opportunities on pg.OpportunityId equals o.Id where o.Id == "0067000000hUBRUAA4" select new { CreatedTimestampUtc = pg.CreatedDa

我有以下LINQtoEntities查询,其中有一个子查询。一切看起来都很好,数据似乎恢复到了应有的状态,但事实并非如此。子查询实际上以某种方式被分块。问题是:

from pg in PhotoGroups
join o in Opportunities
    on pg.OpportunityId equals o.Id
where o.Id == "0067000000hUBRUAA4"
select new {
    CreatedTimestampUtc = pg.CreatedDateUtc,
    DocumentType = pg.DocumentType,
    Items = (
        from p in Photos
        where p.CreatedTimestampUtc == pg.CreatedDateUtc
            && p.DocumentType == pg.DocumentType
            && p.OpportunityId == pg.OpportunityId
        select p.Full
    ),
    OpportunityName = o.Name
}
以下是LINQPad的截图:

红色箭头是块边界出现的位置。奇怪的是,当记录被创建时,它被分组。我的意思是,我创建了这些记录,五人一组,五人一组,五人一组,四人一组,就像他们被分块一样


当我在
foreach
循环中使用结果时,这种分块最终会导致问题。我不知道该怎么办,所以我愿意接受任何建议。

这是LINQ延迟执行的正常行为。 默认情况下,foreach机制将在每个循环中迭代查询1项。 在这里,子查询将在每个循环中执行,并返回一个匿名类型以及该特定子查询的结果。
如果您想全部添加ToList/Array作为一个查询执行。

这是LINQ延迟执行的正常行为。 默认情况下,foreach机制将在每个循环中迭代查询1项。 在这里,子查询将在每个循环中执行,并返回一个匿名类型以及该特定子查询的结果。
如果你想全部添加到列表/数组中,将其作为一个查询执行。

我建议你将对象放平,因此只需一个查询即可完成所有工作,你可以使用group by循环浏览照片

var items=来自照片组中的pg
加入o的机会
关于pg.OpportunityId等于o.Id
加入p的照片
在新的{p.CreatedTimestampUtc,p.DocumentType,p.OpportunityId}上等于新的{CreatedTimestampUtc=pg.createdDatateutc,pg.DocumentType,pg.OpportunityId}
其中o.Id==“0067000000 HUBRUAA4”
选择新的{
CreatedTimestampUtc=pg.CreatedDatautc,
pg.DocumentType,
PhotoFull=p.Full,
OpportunityName=o.名称
}.GroupBy(t=>new{t.OpportunityName,t.DocumentType,t.CreatedTimestampUtc});
var fetchedItems=items.ToList();
foreach(项目中的var项目)
{
Console.WriteLine(item.Key.OpportunityName);
Console.WriteLine(item.Key.DocumentType);
Console.WriteLine(item.Key.CreatedTimestampUtc);
foreach(项目中的var照片)
{
控制台。WriteLine(照片。照片完整);
}
}

我建议您将对象展平,这样只需一次查询即可完成所有工作,您可以使用group by循环浏览照片

var items=来自照片组中的pg
加入o的机会
关于pg.OpportunityId等于o.Id
加入p的照片
在新的{p.CreatedTimestampUtc,p.DocumentType,p.OpportunityId}上等于新的{CreatedTimestampUtc=pg.createdDatateutc,pg.DocumentType,pg.OpportunityId}
其中o.Id==“0067000000 HUBRUAA4”
选择新的{
CreatedTimestampUtc=pg.CreatedDatautc,
pg.DocumentType,
PhotoFull=p.Full,
OpportunityName=o.名称
}.GroupBy(t=>new{t.OpportunityName,t.DocumentType,t.CreatedTimestampUtc});
var fetchedItems=items.ToList();
foreach(项目中的var项目)
{
Console.WriteLine(item.Key.OpportunityName);
Console.WriteLine(item.Key.DocumentType);
Console.WriteLine(item.Key.CreatedTimestampUtc);
foreach(项目中的var照片)
{
控制台。WriteLine(照片。照片完整);
}
}

最终,我决定接受它,因为查询结果被投影到我想要的模型中,即使使用了奇怪的分块。我在接收类的末尾处理了它,并适应了那里的分块。

最终,我决定接受它,因为查询结果被投影到我想要的模型中,即使有奇怪的分块。我在接收课程结束时对其进行了处理,并适应了那里的分块。

我对此表示怀疑,因为数据库中的列是
date
,所以它们总是按日期进行分组,上面的屏幕截图显示它们是。这些分块在数据和类型方面意味着什么?这张可视图像没有告诉我多少。我对此表示怀疑,因为数据库中的列是
日期
,所以它们总是按日期分组,上面的屏幕截图显示它们是。这些数据块在数据和类型方面意味着什么?这张可视图像告诉我的不多。尝试了
ToList
ToArray
,但他们什么也没做,组块仍在继续。@Alex-我认为“组块”这个词不对,你被LINQPad视图误导了:你要求每个结果(外部查询)都包含一个结果列表(内部查询)-这正是你看到的,不完全是。内部查询以某种方式分块。我知道,因为查询结果被传递给了另一个类。在该类中,我循环遍历内部结果,并使用
IndexOf(item)+1
获取临时名称,然后使用该名称将base64编码的图像写入磁盘上的实际文件。它正在工作,但由于分块,它正在覆盖现有文件。例如,较大的内部查询有10个项,但它们被分为2x5。当文件被写入磁盘时,我只看到1-5,而不是1-10。最终,因为我没有时间尝试更正查询,我接受了它,在消费类中,我简单地增加了一个局部变量,并将其用作文件名。我掩盖了这个问题,我没有解决它,但至少现在我还可以。尝试了
ToList
ToArray
,但他们什么也没做,分块仍然在继续。@Alex-我认为“分块”这个词不对,你被LINQPad视图误导了:你要求每个结果(外部查询)都包含一个结果列表(内部查询)-