如何使用方法语法在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#编译器用来传播连接的两部分的范围)的机制会变得更加棘手。

所以稍微改变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是透明标识符 – 但是因为它是透明的,所以在原始查询中看不到它:)

要添加到这里的其他答案,如果你想创build一个新的对象的第三个不同types的一个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子句中创build的中间对象。

请注意,这里我们还查找任何具有与input列表中的一个匹配的property1的联合对象。

我知道这比最初的提问者想要的要复杂一点,但是希望这能帮助别人。