Answers:
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<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的连接对象。
我知道这比原始申请者所要查找的要复杂一些,但希望它将对某人有所帮助。