Мне нужно сделать запрос LINQ2DataSet, который выполняет объединение более чем в одном поле (как
var result = from x in entity
join y in entity2
on x.field1 = y.field1
and
x.field2 = y.field2
Я еще не нашел подходящего решения (я могу добавить дополнительные ограничения к предложению where, но это далеко от подходящего решения, или использовать это решение, но это предполагает эквиджоин).
Возможно ли в LINQ объединить несколько полей в одно соединение?
РЕДАКТИРОВАТЬ
var result = from x in entity
join y in entity2
on new { x.field1, x.field2 } equals new { y.field1, y.field2 }
это решение, на которое я ссылаюсь, как предполагающее эквиджоин выше.
Дальнейшее редактирование
Чтобы ответить на критику, что мой первоначальный пример был эквиджоин, я признаю, что мое текущее требование - эквиойн, и я уже использовал решение, на которое я ссылался выше.
Я, однако, пытаюсь понять, какие возможности и лучшие практики я использую / должен использовать с LINQ. Мне нужно будет сделать соединение запроса диапазона дат с идентификатором таблицы, и я просто решил эту проблему. Похоже, мне нужно будет добавить диапазон дат в предложении where.
Спасибо, как всегда, за все предложения и комментарии
Ответы:
Решение с анонимным типом должно работать нормально. LINQ может представлять только равноценные выражения (в любом случае, с предложениями соединения), и действительно, это то, что вы сказали, что хотите выразить в любом случае на основе вашего исходного запроса.
Если вам не нравится версия с анонимным типом по какой-то конкретной причине, вы должны объяснить эту причину.
Если вы хотите сделать что-то кроме того, о чем вы изначально просили, приведите пример того, что вы действительно хотите сделать.
РЕДАКТИРОВАТЬ: Отвечая на редактирование в вопросе: да, чтобы сделать объединение «диапазон дат», вам нужно вместо этого использовать предложение where. Они действительно семантически эквивалентны, так что это просто вопрос доступных оптимизаций. Equijoins обеспечивают простую оптимизацию (в LINQ to Objects, которая включает в себя LINQ to DataSets) путем создания поиска на основе внутренней последовательности - представьте его как хеш-таблицу из ключа в последовательность записей, соответствующих этому ключу.
Делать это с диапазонами дат несколько сложнее. Однако, в зависимости от того, что именно вы подразумеваете под «объединением диапазона дат», вы можете сделать что-то похожее - если вы планируете создавать «полосы» дат (например, по одной в год), чтобы две записи, которые встречаются в тот же год (но не в тот же день) должен совпадать, тогда вы можете сделать это, просто используя эту полосу в качестве ключа. Если это сложнее, например, одна сторона объединения предоставляет диапазон, а другая сторона объединения предоставляет одну дату, соответствующую, если она попадает в этот диапазон, это будет лучше обрабатываться с помощью
where
предложения (через секундуfrom
оговорка) ИМО. Вы могли бы сделать что-то особенное в стиле фанк, заказав одну или другую сторону для более эффективного поиска совпадений, но это было бы большой работой - я бы сделал такую вещь только после проверки, является ли производительность проблемой.источник
источник
on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 }
это сработалоЭто необходимо сделать, если имена столбцов различаются в двух объектах.
источник
Просто чтобы завершить это с помощью эквивалентного синтаксиса цепочки методов:
В то время как последний аргумент
(x, y) => x
- то, что вы выбираете (в приведенном выше случае мы выбираемx
).источник
Я думаю, что более читабельным и гибким вариантом является использование функции Where:
Это также позволяет легко перейти от внутреннего соединения к левому, добавив .DefaultIfEmpty ().
источник
{ ... } equals new { ... }
синтаксис. LinqPad - отличный инструмент для наблюдения за поведением выражений (SQL-скрипт, если используется LINQ2SQL, деревья выражений и т. Д.)источник
Вы могли бы сделать что-то вроде (ниже)
источник
Используя оператор соединения, вы можете выполнять только эквайоины. Другие типы объединений могут быть созданы с использованием других операторов. Я не уверен, будет ли проще использовать именно эти методы для точного соединения, которое вы пытаетесь сделать, или изменив предложение where. Документацию по предложению соединения можно найти здесь . В MSDN есть статья об операциях объединения с несколькими ссылками на примеры других объединений.
источник
Если имена полей различаются в сущностях
источник
Как полная цепочка методов, которая будет выглядеть так:
источник
это работает для меня
источник
Объявите класс (тип) для хранения элементов, к которым вы хотите присоединиться. В приведенном ниже примере объявить JoinElement
источник