Как linq выбирает между внутренним и внешним объединением - PullRequest
2 голосов
/ 27 марта 2010

Обычно linq использует левое внешнее соединение для своих запросов, но в некоторых случаях решает вместо этого использовать внутреннее соединение. У меня есть ситуация, когда это решение приводит к неправильным результатам, поскольку вторая таблица не всегда имеет подходящие записи, и это удаляет записи из первой таблицы. Я использую linqdatasource над базой данных, где соответствующие таблицы идентичны, но в одной хранятся исторические записи, удаленные из первой. оба имеют одинаковый первичный ключ. и я использую dataloadoption, чтобы загрузить обе таблицы одновременно без круговых поездок.

Не могли бы вы объяснить, почему linq решил использовать здесь внутреннее соединение?

Спасибо

Ответы [ 2 ]

1 голос
/ 27 марта 2010

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

from r in Rabbits
select
{
    r.Name
    r.Parent.Name
}

Это автоматически обойдет родительские отношения и определит подходящий sql для запуска.

Использование .DefaultIfEmpty () надлежащим образом будет означать, что любые пустые записи добавляются, следовательно, оно преобразуется в соответствующее внешнее соединение. Это можно использовать с оператором соединения, добавив «в».

JOIN и LEFT JOIN эквивалент в LINQ

1 голос
/ 27 марта 2010

Нет, к сожалению, вы не правы. Оператор LINQ Join всегда выполняет внутреннее соединение. http://www.hookedonlinq.com/JoinOperator.ashx

Если вы хотите выполнить левое внешнее объединение, вам нужно использовать комбинацию select или foreach. Смотрите эти примеры:

или Google, есть множество примеров.

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