Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用或语法在多个列上使用连接表_C#_Sql_Entity Framework_Linq - Fatal编程技术网

C# 使用或语法在多个列上使用连接表

C# 使用或语法在多个列上使用连接表,c#,sql,entity-framework,linq,C#,Sql,Entity Framework,Linq,所以我想做的是:- SELECT * FROM TableA JOIN TableB ON TableA.OriginPhoneNumber=TableB.Id OR TableA.DestinationPhoneNumber=TableB.Id 我知道这个问题很奇怪!但我正试图在EntityFramework/Linq中复制这一点——查看所有示例,我发现当连接使用AND(使用匿名类型)时,可以用一种非常简单的方法来实现这一点,但OR连接是否存在相同的结果 我使用了Union var firs

所以我想做的是:-

SELECT * FROM TableA
JOIN TableB ON TableA.OriginPhoneNumber=TableB.Id OR TableA.DestinationPhoneNumber=TableB.Id

我知道这个问题很奇怪!但我正试图在EntityFramework/Linq中复制这一点——查看所有示例,我发现当连接使用AND(使用匿名类型)时,可以用一种非常简单的方法来实现这一点,但OR连接是否存在相同的结果

我使用了
Union

var firstJoin=from tbl in TableA
    join c in TableB
        on c.OriginPhoneNumber Equals tbl.Id

var secondJoin=from tbl in TableA
    join c in TableB
        on c.DestinationPhoneNumber Equals tbl.Id

var result=firstJoin.Union(secondJoin)

只需使用where子句进行交叉连接

var results = from a in db.TableA
              from b in db.TableB
              where a.OriginPhonenumber == b.Id 
                    || a.DestinationPhoneNumber == b.Id
              select new { A = a, B = b };

连接条件中的or是否比这更有效值得怀疑,但很可能两者都会导致相同的执行计划。撇开性能不谈,它将给出相同的结果。

您可以进行交叉连接,并在where子句中设置on条件。DB应该足够聪明,可以使用与联接相同的查询执行计划。如果您可以在EF中复制此行为,请查看探查器,找出EF生成的查询。