一尘不染

如何在LINQ中在单个联接中的多个字段上进行联接

c#

我需要执行一个LINQ2DataSet查询,该查询对多个字段进行联接(如

var result = from x in entity
join y in entity2 
       on x.field1 = y.field1 
and 
          x.field2 = y.field2

我还找到了合适的解决方案(我可以在where子句中添加额外的约束,但这与合适的解决方案相去甚远,或者使用解决方案,但假定存在等价联接)。

在LINQ中是否可以在单个联接中联接多个字段?

编辑

var result = from x in entity
             join y in entity2
             on new { x.field1, x.field2 } equals new { y.field1, y.field2 }

是我上面假设为均等连接的解决方案。

进一步 编辑

为了回答批评我最初的例子是等值连接,我承认,我当前的要求是等值连接,并且我已经采用了上面提到的解决方案。

但是,我试图了解我在LINQ中应该/应该采用的可能性和最佳实践。我将需要使用表ID进行日期范围查询联接,并且只是在先于该问题,看来我将不得不在where子句中添加日期范围。

与往常一样,感谢您提出的所有建议和意见


阅读 220

收藏
2020-05-19

共1个答案

一尘不染

具有匿名类型的解决方案应该可以正常工作。LINQ 可以 只表示等值连接(用联接子句,反正),而事实上,你已经什么的说你要根据你的原始查询反正表达。

如果由于某些特定原因而您不喜欢带有匿名类型的版本,则应解释该原因。

如果您想做的不是您最初要求的,请举一个您 真正 想做的事的例子。

编辑:响应问题中的编辑:是的,要进行“日期范围”联接,您需要使用where子句。它们实际上在语义上是等效的,因此这只是可用的优化的问题。Equijoins通过基于内部序列创建查找来提供简单的优化(在LINQ
to Objects中,包括LINQ to DataSets)-将其视为从键到与键匹配的项序列的哈希表。

使用日期范围进行此操作比较困难。但是,根据“日期范围联接”的确切含义,您可以执行 类似的操作
-如果您计划创建日期的“范围”(例如每年一次),以便在日期范围内出现两个条目同一年(但不是同一日期)应该匹配,那么您只需使用该波段作为键即可。如果比较复杂,例如,连接的一侧提供了一个范围,而连接的另一侧提供了一个日期,如果它在该范围内,则匹配,最好用一个where子句(第二个之后from条款)。您可以通过命令一侧或另一侧更有效地查找匹配项来做一些特别时髦的魔术,但这将需要大量工作-
在检查性能是否是问题之后,我只会做这种事情。

2020-05-19