Как сделать соединение в linq to 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()
? Может ли кто-нибудь проиллюстрировать или привести еще один простой пример?
3 ответа:
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 });
Джастин правильно показал расширение в случае, когда за соединением просто следует
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 });
The
z
вот прозрачный идентификатор-но поскольку он прозрачен, вы не можете увидеть его в исходном запросе:)
чтобы добавить к другим ответам здесь, Если вы хотите создать новый объект третьего другого типа с предложением 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, которое соответствует одному из них во входном списке.
Я знаю, что это немного сложнее, чем то, что искал оригинальный Аскер, но, надеюсь, это поможет кому-то.