Dapper sql выбор запроса с оператором соединения, ошибка отображения - PullRequest
0 голосов
/ 13 января 2020

Новичок в dapper и с трудом понимает, как выполнить этот запрос. Я посмотрел на другие примеры на их сайте и ТАК, но мне все еще сложно собрать все вместе.

У меня есть следующая хранимая процедура в моем sql дБ.

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SELECT tests.id AS tests_id, tester.name AS tester_name, product.name AS prod_name, product.version 
    FROM tests JOIN tester ON tests.tester_id =  tester.id 
    JOIN product ON tests.product_id = product.id;
END

Вот мой класс Test вместе с моими классами Product и Tester. Свойства класса Tester и Product совпадают с именами столбцов в таблицах Tester и Product. Таблица Tests содержит только id, tester_id (fk) и product_id (fk).

public class Test
{
    public int Id { get; set; }
    public Tester Tester { get; set; }
    public Product Product { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Version { get; set; }
}

public class Tester
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Я пытаюсь запустить эту хранимую процедуру и заполнить мой объект Test.

public List<Test> GetTests()
{
    using (IDbConnection connection = new SqlConnection(Helper.CnnVal("pqual_db")))
    {
        connection.Open();
        var output = connection.Query<Test, Product, Tester, Test>("pqual_db.sptests_GetTests", (tests, products, tester) => { tests.Product = products; tests.Tester = tester; return tests; }).ToList();
        return output;
    }
}

В настоящее время я получаю ArgumentException: «При использовании API многократного отображения убедитесь, что вы установили параметр splitOn, если у вас есть ключи, отличные от id Имя параметра: splitOn.» Я думаю, что параметр splitOn должен использоваться здесь дважды, один раз для оператора соединения относительно идентификатора тестера и один раз для другого соединения для идентификатора продукта, однако у меня эти столбцы названы по-разному, как вы можете видеть. Разве это не вызвало бы проблемы для брезгливых? Должен ли я go войти в мою базу данных и переименовать мои PK для таблиц, таких как tester.id, в tester.tester_id, чтобы эти запросы работали? Я думаю, мне не нужно так далеко, но я действительно зашла в тупик, как это исправить. Любая помощь будет оценена.

1 Ответ

1 голос
/ 14 января 2020

Можете ли вы попробовать указать имена столбцов в свойстве splitOn следующим образом

public List<Test> GetTests()
{
    using (IDbConnection connection = new SqlConnection(Helper.CnnVal("pqual_db")))
    {
        connection.Open();
        var output = connection.Query<Test, Product, Tester, Test>("pqual_db.sptests_GetTests", (tests, products, tester) => 
    { 
      tests.Product = products; 
      tests.Tester = tester; 
      return tests; 
    }, splitOn:"tester_id,product_id ").ToList();
     return output;
    }
}
...