如何做一个连接在linq到sql与方法语法?

我在LINQ到SQL的例子中看到了很多关于如何在查询语法中进行连接的例子,但我想知道如何用方法语法来做到这一点?例如,我如何做下面的事情

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

.Join()?有人能举例说明或提供另一个简单的例子吗?

131623 次浏览
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语法更具可读性。

Justin已经正确地展示了在join后面只跟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子句创建一个第三种不同类型的新对象(例如,一个不是你的实体框架对象),你可以这样做:

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子句中创建的中间对象。

注意,这里我们还要查找任何具有与输入列表中的某个对象相匹配的property1的连接对象。

我知道这比最初的提问者所寻找的要复杂一些,但希望它能帮助到一些人。