Как выполнить объединение в linq в sql с синтаксисом метода?

Я видел множество примеров в примерах LINQ to SQL о том, как сделать объединение в синтаксисе запросов, но мне интересно, как это сделать с помощью синтаксиса метода? Например, как я могу сделать следующее

var result = from sc in enumerableOfSomeClass join soc in enumerableOfSomeOtherClass on sc.Property1 equals soc.Property2 select new { SomeClass = sc, SomeOtherClass = soc } 

с .Join() ? Может ли кто-нибудь проиллюстрировать или предоставить другой простой пример?

 var result = from sc in enumerableOfSomeClass join soc in enumerableOfSomeOtherClass on sc.Property1 equals soc.Property2 select new { SomeClass = sc, SomeOtherClass = soc }; 

Было бы равнозначно:

 var result = enumerableOfSomeClass .Join(enumerableOfSomeOtherClass, sc => sc.Property1, soc => soc.Property2, (sc, soc) => new { SomeClass = sc, SomeOtherClass = soc }); 

Как вы можете видеть, когда дело доходит до объединений, синтаксис запроса обычно намного читабельнее, чем синтаксис lambda.

Джастин правильно показал расширение в том случае, когда за соединением просто следует select . Если у вас есть что-то еще, это становится более сложным из-за прозрачных идентификаторов – механизма, который использует компилятор C # для распространения области обеих половин соединения.

Поэтому немного изменить пример Джастина:

 var result = from sc in enumerableOfSomeClass join soc in enumerableOfSomeOtherClass on sc.Property1 equals soc.Property2 where sc.X + sc.Y == 10 select new { SomeClass = sc, SomeOtherClass = soc } 

будет преобразовано в нечто подобное:

 var result = enumerableOfSomeClass .Join(enumerableOfSomeOtherClass, sc => sc.Property1, soc => soc.Property2, (sc, soc) => new { sc, soc }) .Where(z => z.sc.X + z.sc.Y == 10) .Select(z => new { SomeClass = z.sc, SomeOtherClass = z.soc }); 

z здесь – прозрачный идентификатор, но поскольку он прозрачен, вы не можете увидеть его в исходном запросе 🙂

Чтобы добавить к другим ответам здесь, если вы хотите создать новый объект третьего типа с предложением where (например, тем, что не является объектом Entity Framework), вы можете сделать это:

 public IEnumerable demoMethod(IEnumerable property1Values) { using(var entityFrameworkObjectContext = new EntityFrameworkObjectContext ) { var result = entityFrameworkObjectContext.SomeClass .Join(entityFrameworkObjectContext.SomeOtherClass, sc => sc.property1, soc => soc.property2, (sc, soc) => new {sc, soc}) .Where(s => propertyValues.Any(pvals => pvals == es.sc.property1) .Select(s => new ThirdNonEntityClass { dataValue1 = s.sc.dataValueA, dataValue2 = s.soc.dataValueB }) .ToList(); } return result; } 

Обратите особое внимание на промежуточный объект, созданный в предложениях Where и Select.

Обратите внимание, что здесь мы также ищем любые объединенные объекты, у которых есть свойство1, которое соответствует одному из входящих в список ввода.

Я знаю, что это немного сложнее, чем то, что искал первоначальный искатель, но, надеюсь, это поможет кому-то.

  • Как выбрать только записи с наивысшей датой в LINQ
  • Linq to SQL, как это сделать ", где в (список значений)"
  • Как использовать «содержит» или «как» в динамическом запросе linq?
  • Вложенные хранимые процедуры, содержащие шаблон TRY CATCH ROLLBACK?
  • Разница между Select и SelectMany
  • Лучший способ обновить classы LINQ to SQL после изменения схемы базы данных
  • Entity Framework / Linq to SQL: Skip & Take
  • C # Linq to SQL: Как выразить «CONVERT ( AS INT)»?
  • Возrotation IEnumerable против IQueryable
  • Шаблон T4 для создания имен
  • C # Linq-to-Sql - Если DataContext будет удален с помощью IDisposable
  • Interesting Posts

    Как использовать ASP.NET Identity 2.0, чтобы позволить пользователю олицетворять другого пользователя?

    Как получить максимальное разрешение на Ubuntu в Microsoft Virtual PC?

    Как агрегировать значения в коллекции после groupBy?

    Итеративный декартово произведение в Java

    BroadcastReceiver при изменении состояния сети Wi-Fi или 3g

    VirtualBox: как синхронизировать хост и гостевое время?

    Radeon HD 3670 на ноутбуке Dell XPS16. Возможны ли 3 монитора?

    В Word 2007, как создать таблицу пейзажей на странице портрета?

    Найти все дочерние процессы моего собственного процесса .NET / выяснить, является ли данный процесс моим собственным ребенком?

    Обеспечение только одного экземпляра приложения

    Не удалось решить: com.android.support.design:25.4.0

    Уточнение причины смешивания Неявные и явные ожидания документа Selenium

    Почему изменения в jQuery $ .fn.data () не изменяют соответствующие атрибуты html 5 data- *?

    Является ли потомок HttpSession безопасным, установлены / получаются операции с атрибутами streamа атрибутов?

    Как вы можете делать пейджинг с NHibernate?

    Давайте будем гением компьютера.