SQL, объединяющий две таблицы для запроса - PullRequest
0 голосов
/ 05 июня 2018

Базовое краткое изложение.Я пытаюсь получить список TestSuiteExecutions на основе TestRunId.Поэтому мне нужно выполнить поиск на основе TestSuiteId и TestRunId, чтобы получить список TestSuiteExectuions на основе того, из какого TestRun они были выполнены.Обратите внимание, что 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 голосов
/ 05 июня 2018

В этом слепом ударе, но в LINQ есть 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 на ходу, вы сможете сделать это:

from suite in Context.TestSuiteExecution
join r in Context.TestRunExecution on suite.TestRunExecutionId equals r.TestRunExecutionId
    into runs
from run in runs.DefaultIfEmpty()
select new 
{
    TestSuiteExecutionId = suite.TestSuiteExecutionId,
    TestSuiteId = suite.TestSuiteId,
    TestRunExecutionId = suite.TestRunExecutionId,
    TestRunId = run.TestRunId
}
0 голосов
/ 05 июня 2018

Вы можете выразить свой запрос с помощью экзистенциального квантификатора, например:

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
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...