如何使用方法语法在 linq to sql 中进行连接?
Posted
技术标签:
【中文标题】如何使用方法语法在 linq to sql 中进行连接?【英文标题】:How to do a join in linq to sql with method syntax? 【发布时间】:2011-03-14 03:48:40 【问题描述】:我在 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()
?谁能说明或提供另一个简单的例子?
【问题讨论】:
【参考方案1】: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 语法更具可读性。
【讨论】:
【参考方案2】:Justin 正确地显示了在连接后跟 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
是透明标识符——但因为它是透明的,所以在原始查询中看不到它:)
【讨论】:
【参考方案3】:要在此处添加其他答案,如果您想使用 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 的连接对象。
我知道这比最初的提问者所寻找的要复杂一些,但希望它会对某人有所帮助。
【讨论】:
以上是关于如何使用方法语法在 linq to sql 中进行连接?的主要内容,如果未能解决你的问题,请参考以下文章
Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)