ОК, давайте предположим, что у нас есть 2 таблицы: dbo.User
и dbo.Client
.Каждый client
может быть подключен (или нет) к user
.Таким образом, client
записи имеют поле внешнего ключа, которое может иметь значение NULL, идентифицирующее user
.
Для запроса:
var query = context.Clients
.Select(c => c.User);
LINQ выдаст нечто похожее на:
SELECT [t2].[test], [t2].[Id], [t2].[Username], ...
FROM [dbo].[Client] AS [t0]
LEFT OUTER JOIN (
SELECT 1 AS [test], [t1].[Id], [t1].[Username], ...
FROM [dbo].[User] AS [t1]
) AS [t2] ON [t2].[Id] = [t0].[UserId]
Так как не все записи client
имеют совпадающую запись user
, LINQ создает запрос, который гарантирует, что для каждого бесполезного client
будет строка, заполненная нулями.Это делается путем создания дополнительного фиктивного столбца с именем [test]
.
. Таким образом, строки, для которых [test]
значение столбца установлено в 1
, действительно связаны с user
сущностью.
IПредположим, что этот столбец [test]
используется LINQ в качестве флага, означающего «эй, вот клиент с пользователем».
Если я решу переписать этот запрос, я буду использовать user
первичный ключв качестве индикатора, но, похоже, для LINQ проще использовать столбец [test]
.