小编典典

如何在 LINQ 中对单个连接中的多个字段进行连接

all

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

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

在 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 子句中添加日期范围。

一如既往地感谢您提供的所有建议和意见


阅读 81

收藏
2022-04-27

共1个答案

小编典典

匿名类型的解决方案应该可以正常工作。LINQ 只能
表示等值连接(无论如何都带有连接子句),实际上这就是您所说的,无论如何您都希望根据您的原始查询来表达。

如果您出于某种特定原因不喜欢匿名类型的版本,则应说明该原因。

如果您想做的不是您最初要求的事情,请举例说明您 真正 想做的事情。

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

使用日期范围执行此操作有些困难。但是,根据您所说的“日期范围连接”的确切含义,您可能可以做 类似 的事情-
如果您计划创建日期的“带”(例如每年一个),以便两个条目出现在同一年(但不是同一天)应该匹配,那么您只需使用该带作为键即可。如果它更复杂,例如连接的一侧提供一个范围,而连接的另一侧提供一个日期,如果它在该范围内匹配,则最好使用where子句处理(在一秒钟后from条款)IMO。您可以通过订购一侧或另一侧来更有效地找到匹配项来做一些特别时髦的魔法,但这将是很多工作
- 我只会在检查性能是否存在问题后才会做那种事情。

2022-04-27