Linq-запрос возвращает меньше записей, чем Sql Query - PullRequest
1 голос
/ 19 марта 2011

Я столкнулся с большой проблемой с простым запросом linq .. Я использую EF 4.0 .. Я пытаюсь взять все записи из таблицы, используя запрос linq:

var result = context.tablename.select(x=>x);

Это приводит кменьше строк, чем в обычном SQL-запросе select * from tablename;

Эта таблица содержит более 5 таблиц в качестве дочерних объектов (отношения внешнего ключа: один к одному и один ко многим и т. д.) ..

Эта переменная результата после выполнения этого оператора linq возвращает записи со всеми значениями дочерних объектов без выполнения оператора include.

Я не знаю, является ли это поведение по умолчанию EF 4.0 ..

Я попробовал это утверждение также в linqpad .. но это бесполезно ...

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

Выполняет ли он внутренние объединения со всеми дочерними таблицами перед возвратом всех записей этой родительской таблицы ??

пожалуйста, помогите мне..

Ответы [ 2 ]

0 голосов
/ 19 марта 2011

В этой таблице более 5 таблиц. дочерние объекты (отношения внешних ключей: один к одному и один ко многим и т.д.) ..

Эта переменная результата после выполнения этот оператор linq возвращает записи со всеми значениями дочерних объектов без делает оператор включения ..

Итак, мы, вероятно, говорим о представлении базы данных или о пользовательском DefiningQuery в SSDL.

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

0 голосов
/ 19 марта 2011

Самый простой способ устранения проблем такого типа - посмотреть на сгенерированный SQL, созданный инструментом ORM.

Если вы используете SQL Server, а затем SQL Profiler для просмотра сгенерированного SQL.

Из того, что вы описываете, возможное объяснение может заключаться в том, что ваши отношения между сущностями являются обязательными и, следовательно,применение INNER объединений вместо LEFT OUTER объединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...