SQL, объединяющий две таблицы для запроса

TLBB спросил: 12 мая 2018 в 04:25 в: c#

Исходное значение. Я пытаюсь получить список 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 ответа

Есть решение
dasblinkenlight ответил: 12 мая 2018 в 04:55

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

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 ниже:

TyCobb ответил: 12 мая 2018 в 04:51

Взяв слепой удар, но в LINQ есть join.

Очевидно, вам нужно будет исправить свои свойства Context, но это должно работать без особых усилий.

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
}