2008-10-14 2 views
9

В с помощью LINQ к SQL класса, почему свойства, которые созданы из внешних ключей EntitySet объектов, которые реализуют IEnumerable, где, как объекты на DataContext являются Table объекты, которые реализуют IQueryable?EntitySet против таблицы производительности запросов в LINQ2SQL

EDIT: Чтобы уточнить, вот пример, который иллюстрирует то, что я пытаюсь понять. Этот пример:

ctx.Matches.Where(x => x.MatchID == 1).Single() 
      .MatchPlayers.Max(x => x.Score); 

попадает в базу данных в два раза, где, как:

ctx.MatchPlayers.Where(x => x.MatchID == 1) 
       .Max(x => x.Score); 

работает только 1 запрос. Вот следы:

exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date] 
FROM [dbo].[Matches] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score] 
FROM [dbo].[MatchPlayers] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 

и

exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value] 
FROM [dbo].[MatchPlayers] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 

, который также показывает, что еще хуже, максимальная делается на уровне C#, а не в базе данных.

Я знаю, что причина, это происходит разница между IQueryable с и IEnumerable с, так почему не MatchPlayers объекта в первом примере реализации интерфейса IQueryable, чтобы получить то же преимущество, что и последний пример.

ответ

1

Таблицы являются фактически концептуальным вопросом - они действительно существуют на сервере, поэтому вам нужно запросить, чтобы получить записи. Записи внешнего ключа - это те, которые действительно получены другим запросом, поэтому в этот момент они доступны локально. Это довольно глупое описание, но, надеюсь, оно перешло в общую концепцию.

3
ctx.Matches.Where(x => x.MatchID == 1).Single() 

Одиночный() возвращает совпадение, а не IQueryable (Match).

Просто нажмите Single() от до последнего шага:

ctx.Matches 
    .Where(m => m.MatchID == 1) 
    .Select(m => m.MatchPlayers.Max(mp => mp.Score)) 
    .Single(); 

Что этот запрос свидетельствует о том, что это нормально, чтобы использовать свойство MatchPlayers в запросе. Что касается моей интерпретации вопроса афера: «Почему я не могу использовать EntitySet в запросе?», Вы можете.

0

Это было addressed on the MSDN forums. Суть аргументации в том, что очень сложно отслеживать добавленные и удаленные объекты при выполнении запросов к базе данных. Вместо этого EntitySet является чем-то вроде локальной копии связанных объектов, с которыми вы можете манипулировать. К сожалению, как вы заметили, это имеет побочный эффект передачи выражений в вызовы LINQ to Objects вместо более эффективного выполнения LINQ to SQL.

Смежные вопросы