То, как сделать, участвует в LINQ на нескольких полях в единственном соединении

Предупреждение: невозможно изменить информацию заголовка - уже отправленные заголовки

Случается, когда ваш скрипт пытается отправить HTTP-клиенту клиенту, но он уже был выведен ранее, что привело к тому, что заголовки уже отправлены на клиент.

Это E_WARNING , и он не остановит сценарий.

Типичным примером может быть файл шаблона, подобный этому:


    
    My Page

...

Функция session_start() попытается отправить клиенту файлы cookie сеанса. Но PHP уже отправил заголовки, когда он написал элемент в выходной поток. Вам нужно будет переместить session_start() в верхнюю часть.

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

Часто пропускаемый вывод - это новые строки после закрытия PHP ?>. Считается стандартной практикой опускать ?>, когда это последняя вещь в файле. Аналогичным образом, еще одной распространенной причиной этого предупреждения является то, что перед открытием перед ним появляется пустое пространство, строка или невидимый символ, в результате чего веб-сервер отправляет заголовки и пробел / новую строку, таким образом, когда PHP начинает синтаксический анализ, он не сможет для отправки любого заголовка.

Если в вашем файле содержится более одного кодового блока , у вас не должно быть пробелов между ними. (Примечание: у вас может быть несколько блоков, если у вас есть код, который был автоматически сконструирован)

Также убедитесь, что в вашем коде не указаны знаки байтового заказа, например, когда кодировка скрипта является UTF -8 с BOM.

Вопросы, относящиеся

234
задан Community 23 May 2017 в 02:10
поделиться

4 ответа

Решение с анонимным типом должно хорошо работать. LINQ может только представлять объединения по эквивалентности (с пунктами соединения, так или иначе), и действительно это - то, что Вы сказали, что хотите выразить так или иначе на основе Вашего исходного запроса.

, Если Вам не нравится версия с анонимным типом по некоторой определенной причине, необходимо объяснить ту причину.

, Если Вы хотите сделать что-то другое, чем, что Вы первоначально попросили, дайте пример того, что Вы действительно хотите сделать.

РЕДАКТИРОВАНИЕ: Ответ на редактирование в вопросе: да, чтобы сделать соединение "диапазона дат", необходимо использовать где пункт вместо этого. Они семантически эквивалентны действительно, таким образом, это - просто вопрос доступных оптимизаций. Объединения по эквивалентности обеспечивают простую оптимизацию (в LINQ к Объектам, который включает LINQ в DataSets) путем создания поиска на основе внутренней последовательности - думают о нем как о хеш-таблице от ключа до последовательности записей, соответствующих тому ключу.

Выполнение этого с диапазонами даты несколько более трудно. Однако в зависимости от точно, что Вы подразумеваете под "соединением диапазона дат", можно быть в состоянии сделать что-то подобный - если Вы - планирование создания "полос" дат (например, один в год) таким образом, что две записи, которые происходят в том же году (но не в ту же дату) должны соответствовать, тогда можно сделать это только при помощи той полосы как ключ. Если это более сложно, например, одна сторона соединения обеспечивает диапазон, и другая сторона соединения обеспечивает единственную дату, соответствуя, если бы это находится в пределах того диапазона, который был бы лучше обработан с where пункт (после секунды from пункт) IMO. Вы могли сделать некоторое особенно броское волшебство, приказав, чтобы одна сторона или другой нашли соответствия более эффективно, но это будет большой работой - я только сделал бы такую вещь после проверки, является ли производительность проблемой.

87
ответ дан Jon Skeet 23 November 2019 в 03:29
поделиться
var result = from x in entity
   join y in entity2 on new { x.field1, x.field2 } equals new { y.field1, y.field2 }
127
ответ дан Nathan W 23 November 2019 в 03:29
поделиться

Вы могли сделать что-то как (ниже)

var query = from p in context.T1

        join q in context.T2

        on

        new { p.Col1, p.Col2 }

        equals

         new { q.Col1, q.Col2 }

        select new {p...., q......};
8
ответ дан Perpetualcoder 23 November 2019 в 03:29
поделиться

Используя оператор объединения можно только выполнить объединения по эквивалентности. Другие типы соединений могут быть созданы с помощью других операторов. Я не уверен, было ли точное соединение, которое Вы пытаетесь сделать, более легким использованием этих методов или путем изменения где пункт. Документация относительно пункта соединения может быть найдена здесь . MSDN имеет статья об операциях соединения с несколькими ссылками на примеры других соединений, также.

7
ответ дан tvanfosson 23 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: