почему LINQ 2 SQL иногда добавляет поле типа select 1 в качестве теста, другие допустимые поля - PullRequest
6 голосов
/ 21 апреля 2010

Мне нужно выполнить запрос 2 linq2sql, и у меня возникла проблема, поскольку запрос 2 не возвращает одинаковое количество столбцов, что странно, если после запросов .ToList () они могут объединяться без проблем.

Причина в том, что по некоторой причине linq2sql у меня есть еще 2 столбца с именем test и test2, которые происходят из 2 левого внешнего соединения, которое автоматически создает linq2sql, что-то вроде "select 1 в качестве теста, tablefields"

Есть ли для этого веская причина? как убрать это лишнее поле «1 как тест»?

вот несколько примеров того, как это выглядит: google результат для linq 2 sql "выберите 1 в качестве теста"

1 Ответ

5 голосов
/ 22 апреля 2010

ОК, давайте предположим, что у нас есть 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].

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