Предполагая, что у меня есть:два различных запросов LINQ против того же Entity Framework DbSet, возвращают те же результаты
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();
Тогда результат сохраняется в activitiesEnd будет результат выполнения запроса activitiesStart. Если я сначала выполнил запрос 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("");
Это выводит два ряда из них, потому что activitiesStart была выполнена в первую очередь. Если я поменяю их, я получаю две строки по два. Профилировщик SQL Server показывает, что запросы были правильно отправлены на сервер.
Каковы значения startSnapshot и endSnapshot? Как назначаются люди? –
Я не вижу причин, по которым они будут влиять друг на друга. Когда вы отлаживаете до первого оператора, каковы значения startSnapshot и endSnapShot? – sovemp
Они являются параметрами функции, а в моем тестовом случае - 1 (начало) и 2 (конец). Я уточню вопрос. –