如何使用方法语法在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的联合对象。
我知道这比最初的提问者想要的要复杂一点,但是希望这能帮助别人。