SQL,结合两个表进行查询

时间:2018-06-05 18:05:28

标签: c# sql entity-framework linq

基本纲要。我试图根据TestRunId获取TestSuiteExecutions列表。因此,我需要根据TestSuiteId和TestRunId进行搜索,以根据执行的TestRun获取TestSuiteExectuions的列表。请注意,TestSuiteExecutionId可能没有关联的TestRunExecutionId,这只是意味着它被排除在搜索之外。

我遇到的问题是主表缺少TestRunId,所以我需要找到/连接该关联或通过多次搜索自己制作(我不想为了效率而做)

类似的东西;

from t in testSuiteExecutionsTable
where t.testSuiteId == testSuiteId &&  t.testRunId == testRunId
select t).ToList();

TestSuiteExecutions表包含以下信息,

TestSuiteExecutionId  TestSuiteId  TestRunExecutionId
--------------------  -----------  ------------------
        990                1               100
        991                2               NULL
        992                3               102
        993                1               103

问题是为了完成搜索,我需要关联的TestRunId。有一个单独的表,其中包含相关的TestRunExecutionId和TestRunId,如下所示

TestRunExecutionsTable

 TestRunExecutionId    TestRunId
--------------------  -----------
        100                1
        102                2
        103                1

我一直在读SQL连接,在一个完美的世界中,我将能够使用以下列创建一个临时表来执行我的查询,

TestSuiteExecutionId  TestSuiteId  TestRunExecutionId TestRunId
--------------------  -----------  ------------------ ---------
        990                1               100            1
        991                2               NULL          NULL
        992                3               102            2
        993                1               103            1

这样我就可以在TestSuite运行哪个TestRuns之间建立连接,并且能够得到我的TestSuiteExecutions集合。两个表之间的连接桥是TestRunExecutionId,但我不确定如何使用哪种类型的连接,或者如何以LINQ格式写出连接

2 个答案:

答案 0 :(得分:2)

您可以使用存在量词来表达您的查询,如下所示:

var res = dbContext.TestSuiteExecutionsTable.Where(e =>
    e.TestSuiteId == testSuiteId && dbContext.TestRunExecutionsTable.Any(r =>
        r.TestRunId == testRunId && r.TestRunExecutionId == e.TestRunExecutionId
    )
).ToList();

这适用于1:1和1:许多关系,大致对应于下面的SQL:

SELECT *
FROM TestSuiteExecutionsTable e
WHERE e.TestSuiteId = @testSuiteId
  AND EXISTS (
      SELECT *
      FROM TestRunExecutionsTable r
      WHERE r.TestRunId = @testRunId AND r.TestRunExecutionId = e.TestRunExecutionId
  )

答案 1 :(得分:2)

对此进行盲目攻击,但LINQ中有~=

显然你需要纠正你的Context属性,但这应该没有太多的小问题。

join

如果你需要from suite in Context.TestSuiteExecution join run in Context.TestRunExecution on suite.TestRunExecutionId equals run.TestRunExecutionId select new { TestSuiteExecutionId = suite.TestSuiteExecutionId, TestSuiteId = suite.TestSuiteId, TestRunExecutionId = suite.TestRunExecutionId, TestRunId = run.TestRunId } 跑步,你应该能够做到这一点:

LEFT JOIN