Linq to Entities - PullRequest
       12

Linq to Entities

1 голос
/ 08 июня 2009

Я создал модель Entity Framework (v1), которая включает наследование, например:

Базовый класс: Выпуск

<- <strong>Жалоба

<- <strong>CustomerQuery и т.д. (6 производных классов)

Эти классы сопоставляются с соответствующими таблицами в SQL Server.

Я был впечатлен тем, как я мог затем использовать LINQ для сущностей для создания - EF выясняет, что он должен поместить некоторые данные в одну таблицу, получить значение ключа идентификации и использовать его в другой таблице.

НО: когда я делаю простой запрос, такой как следующий

var result = dataContext.IssueSet.Where(x => x.Id == id);

... ToTraceString показывает SQL-код длиной более 1000 строк ! И он выполняет ужасно.

Как вы думаете, вероятно, что я сделал что-то не так в своей модели или это огромный код SQL, характерный для структур наследования в L2E?

P.S. Вот начало строки трассировки SQL для информации:

SELECT 
1 AS [C1], 
CASE WHEN (( NOT (([UnionAll8].[C45] = 1) AND ([UnionAll8].[C45] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C46] = 1) AND ([UnionAll8].[C46] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C47] = 1) AND ([UnionAll8].[C47] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C48] = 1) AND ([UnionAll8].[C48] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C49] = 1) AND ([UnionAll8].[C49] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C50] = 1) AND ([UnionAll8].[C50] IS NOT NULL))) 
AND ( NOT (([UnionAll8].[C51] = 1) AND ([UnionAll8].[C51] IS NOT NULL))) 
AND ( NOT 

1 Ответ

1 голос
/ 09 июня 2009

Я не думаю, что этот запрос простой. Подумайте о том, что вы просите в действительности сделать платформу: материализовать сущность, которая может быть одного из шести различных типов. Фактически, вы, вероятно, знаете, какой тип сущности вы пытаетесь материализовать; вы просто не передали эту информацию каркасу.

Итак, некоторые мысли:

  • При выборе сущностей одного типа из набора сущностей, который включает в себя несколько типов, использует OfType, чтобы сообщить платформе, что вы не собираетесь материализовать какие-либо другие типы .
  • Рассмотрите возможность использования таблицы для иерархии, а не таблицы для моделей типов, особенно когда большинство подтипов имеют много общих полей.
  • В рамках ограничений хорошего OOD не злоупотребляйте наследованием. Я считаю, что многие люди склонны использовать наследование для проблем, которые лучше решать с помощью композиции, с или без Entity Framework.
  • Будьте осторожны при списании Entity Framework просто потому, что у вас возникла проблема при первой попытке использовать его при чтении чего-либо на доске объявлений, что заставило вас задуматься. Фреймворк сложный, он работает не так, как многие ожидают, но он хорошо работает, когда вы его понимаете. Ваша первая попытка его использования, вероятно, не будет правильной. Придерживайтесь этого и узнайте, как работает фреймворк.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...