当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在单个连接中的多个字段上进行LINQ连接》经验,为你挑选了8个好方法。

我需要做一个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子句中添加日期范围.

一如既往地感谢所有建议和意见



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


上面的代码不起作用.在新的{X1 = x.field1,X2 = x.field2}上添加```等于new {X1 = y.field1,X2 = y.field2}```
可以使用LINQ方法语法完成吗?

2> Jon Skeet..:

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

如果您因某些特定原因不喜欢具有匿名类型的版本,则应解释该原因.

如果你想做的不是你原来要求的事情,请举例说明你真正想做的事情.

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

使用日期范围执行此操作有点困难.但是,根据"日期范围连接"的具体含义,您可能可以执行类似的操作 - 如果您计划创建日期的"乐队"(例如,每年一次),那么两个条目将出现在同一年(但不是在同一天)应该匹配,那么你可以只使用那个乐队作为关键.如果它更复杂,例如,连接的一侧提供范围,而连接的另一侧提供单个日期,如果它在该范围内,则匹配,使用where子句可以更好地处理(在一秒之后)from条款)IMO.你可以通过命令一方或另一方更有效地找到匹配来做一些特别时髦的魔术,但那将是很多工作 - 我只会在检查性能是否是一个问题之后做这种事情.



3> 小智..:
var result = from x in entity1
             join y in entity2
             on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 }

如果两个实体中的列名不同,则需要执行此操作.


谢谢你提到不同的列名.这修复了我的坏表达.

4> niieani..:

只是用等效的方法链语法来完成它:

entity.Join(entity2, x => new {x.Field1, x.Field2},
                     y => new {y.Field1, y.Field2}, (x, y) => x);

虽然最后一个参数(x, y) => x是您选择的(在上面的例子中我们选择x).



5> Alexei..:

我认为更可读和灵活的选择是使用Where函数:

var result = from x in entity1
             from y in entity2
                 .Where(y => y.field1 == x.field1 && y.field2 == x.field2)

这也允许通过附加.DefaultIfEmpty()轻松地从内连接更改为左连接.



6> 小智..:
var result = from x in entity
             join y in entity2
             on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 }
             select new 
             {
               /// Columns
              };



7> Perpetualcod..:

你可以做点什么(下面)

var query = from p in context.T1

        join q in context.T2

        on

        new { p.Col1, p.Col2 }

        equals

         new { q.Col1, q.Col2 }

        select new {p...., q......};



8> tvanfosson..:

使用join运算符,您只能执行equijoins.可以使用其他运算符构造其他类型的连接.我不确定使用这些方法或更改where子句,您尝试进行的确切连接是否更容易.有关join子句的文档可以在这里找到.MSDN上有一篇关于连接操作的文章,其中还有多个指向其他连接示例的链接.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有