cho*_*bo2 187 linq-to-sql ef-fluent-api
我在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 }
Run Code Online (Sandbox Code Playgroud)
用一个.Join()
?谁能说明或提供另一个简单的例子吗?
Jus*_*ner 271
var result = from sc in enumerableOfSomeClass
join soc in enumerableOfSomeOtherClass
on sc.Property1 equals soc.Property2
select new { SomeClass = sc, SomeOtherClass = soc };
Run Code Online (Sandbox Code Playgroud)
相当于:
var result = enumerableOfSomeClass
.Join(enumerableOfSomeOtherClass,
sc => sc.Property1,
soc => soc.Property2,
(sc, soc) => new
{
SomeClass = sc,
SomeOtherClass = soc
});
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,当涉及到连接时,查询语法通常比lambda语法更具可读性.
Jon*_*eet 124
贾斯汀已经正确地展示了联接紧随其后的扩展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 }
Run Code Online (Sandbox Code Playgroud)
会被转换成这样的东西:
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 });
Run Code Online (Sandbox Code Playgroud)
在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;
}
Run Code Online (Sandbox Code Playgroud)
请特别注意在Where和Select子句中创建的中间对象.
请注意,这里我们还查找任何连接对象,这些对象的property1与输入列表中的一个匹配.
我知道这比最初的提问者想要的要复杂一点,但希望它能帮到某个人.
归档时间: |
|
查看次数: |
112619 次 |
最近记录: |