假设我有:
class ContractContext : DbContext
{
DbSet<ACTIVITY> ACTIVITYs { get; set; }
}
我有以下代码,其中startSnapshot和endSnapshot是值为1和2的整数:
var activitiesStart = contractContext.ACTIVITYs.Where(a => a.VARIANCE_SNAPSHOT_ID == startSnapshot);
var activitiesEnd = contractContext.ACTIVITYs.Where(a => a.VARIANCE_SNAPSHOT_ID == endSnapshot);
这两个查询将返回相同的结果。该结果将是所执行的两个查询中第一个查询的结果。因此,如果我强迫它们都使用ToList()执行,
var activitiesStart = contractContext.ACTIVITYs.Where(a => a.VARIANCE_SNAPSHOT_ID == startSnapshot).ToList();
var activitiesEnd = contractContext.ACTIVITYs.Where(a => a.VARIANCE_SNAPSHOT_ID == endSnapshot).ToList();
然后,存储在activityEnd中的结果将是来自activityStart查询的结果。如果我先执行activityEnd查询,则相反。这是怎么回事?我知道它们是相同的上下文,并且我想我可以看到如果我在执行两个查询之前都创建它们的话,它将如何组合查询。但是,在第二种情况下,一个在创建另一个之前就被执行了,那么为什么它会践踏第二个查询呢?
生成的SQL(两者相同):
{SELECT
[Extent1].[ACTIVITY_ID] AS [ACTIVITY_ID],
[Extent1].[ACTIVITY_NAME] AS [ACTIVITY_NAME],
[Extent1].[WBS_ID] AS [WBS_ID],
[Extent1].[VARIANCE_SNAPSHOT_ID] AS [VARIANCE_SNAPSHOT_ID],
[Extent1].[DUE_DATE] AS [DUE_DATE],
[Extent1].[IS_COMPLETE] AS [IS_COMPLETE]
FROM [p6].[ACTIVITY] AS [Extent1]
WHERE [Extent1].[VARIANCE_SNAPSHOT_ID] = @p__linq__0}
var activitiesStart = contractContext.ACTIVITYs.Where(a => a.VARIANCE_SNAPSHOT_ID == 1).ToList();
var activitiesEnd = contractContext.ACTIVITYs.Where(a => a.VARIANCE_SNAPSHOT_ID == 2).ToList();
foreach (var item in activitiesStart)
{
Debug.Write(item.VARIANCE_SNAPSHOT_ID + " ");
}
Debug.WriteLine("");
foreach (var item in activitiesEnd)
{
Debug.Write(item.VARIANCE_SNAPSHOT_ID + " ");
}
Debug.WriteLine("");
这会打印出两行,因为先执行activityStart。如果我交换它们,我将得到两行两的。SQL Server Profiler显示查询已正确发送到服务器。
我无法弄清楚这一点。我的解决方案是在执行的第一个上使用AsNoTracking。
var activitiesStart = contractContext.ACTIVITYs.AsNoTracking.Where(a => a.VARIANCE_SNAPSHOT_ID == startSnapshot).ToList();
var activitiesEnd = contractContext.ACTIVITYs.Where(a => a.VARIANCE_SNAPSHOT_ID == endSnapshot).ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句