【发布时间】:2016-06-23 18:44:26
【问题描述】:
假设我有:
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 显示查询已正确发送到服务器。
【问题讨论】:
-
startSnapshot 和 endSnapshot 的值是多少?这些是如何分配的?
-
我看不出它们会相互影响的任何原因。调试到第一条语句时,startSnapshot 和 endSnapShot 的值是多少?
-
它们是函数的参数,在我的测试用例中是 1(开始)和 2(结束)。我会更新问题。
-
我认为
startSnapshot和endSnapshot的实际值并不相关,只要我们都理解值不同的含义即可 -
生成的SQL相同(应该相同)并不代表
@p__linq__0参数的值相同,结果也一样。
标签: c# entity-framework linq