Как выполнить объединение в 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 }
с a .Join()
? Может ли кто-нибудь проиллюстрировать или предоставить другой простой пример?
Ответы
Ответ 1
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
});
Как вы можете видеть, когда дело доходит до объединений, синтаксис запроса обычно намного читабельнее, чем синтаксис лямбда.
Ответ 2
Джастин правильно показал разложение в случае, когда за соединением просто следует select
. Если у вас есть что-то еще, это становится более сложным из-за прозрачных идентификаторов - механизма, который использует компилятор С# для распространения области обеих половин соединения.
Итак, слегка измените пример Justin:
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
здесь - прозрачный идентификатор, но поскольку он прозрачен, вы не можете увидеть его в исходном запросе:)
Ответ 3
Чтобы добавить к другим ответам здесь, если вы хотите создать новый объект третьего типа с предложением where (например, не являющимся вашим объектом Entity Framework), вы можете сделать это:
public IEnumerable<ThirdNonEntityClass> demoMethod(IEnumerable<int> 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, которое соответствует одному из входящих в список ввода.
Я знаю, что это немного сложнее, чем то, что искал первоначальный искатель, но, надеюсь, это поможет кому-то.