Объединения, вероятно, более распространены для людей, исходящих из реляционного мышления, чем объектно-ориентированного.Если вы думаете о своем проблемном пространстве с объектно-ориентированной точки зрения, гораздо более естественно работать с отношениями, где вы можете разбить навигацию: Employee.Customers.Orders.OrderItems.OrderItem
, чем иметь дело с кучей объединений.Оригинальный технический документ ADO.vNext проделал хорошую работу по обсуждению преимуществ использования модели и ассоциаций, а не объединений для работы с вашими концептуальными моделями.К сожалению, на данный момент я не могу найти этот документ.
Для меня объединения лучше всего использовать, когда у вас нет естественных ассоциаций между сущностями.Например, если вы пытаетесь объединить элементы на неестественных ключах (например, объединение на Customer.State
и Shipping.State
), вы должны использовать синтаксис объединения (или SelectMany
), а не создавать ассоциации между вашими сущностями в этом случае.
Следует помнить одну вещь: синтаксис объединения и использование ассоциаций могут привести к различиям в типах соединений, генерируемых поставщиком.Как правило, объединение преобразуется во внутреннее объединение и исключает элементы, в которых нет совпадения с обеих сторон объединения.Чтобы выполнить (левое) внешнее объединение, вы используете расширение DefaultIfEmpty
.
Перемещение по ассоциациям в отношениях 1-0 .. *, с другой стороны, обычно переводится в правые внешние соединения, потому что дочерняя коллекция может быть законно пустой, и вы захотите включить родителя, даже если ребенок не сделал этого.не существует.Вы бы использовали !Any()
для отлова дел, в которых нет дочерних записей.