Получить конкретный столбец из более резкого набора результатов - PullRequest
0 голосов
/ 22 октября 2019

Я новичок в использовании Dapper и хочу получить лучший способ извлечения данных из определенного столбца в строке Dapper. Данные извлекаются из хранимой процедуры, которая возвращает 1 или более строк с 5 столбцами, но мне нужно только получить данные из 1 столбца для этого конкретного метода. Мой код на самом деле работает, но я знаю, что есть лучший способ написать это и хотел бы применить его.

Вот пример результата хранимой процедуры: {{DapperRow, prodid = 'b1', prodname = 'sampleproduct ', description =' только тест ', qty =' 1 ', Остатки акций =' 10 '}}

Вот фрагмент моего кода:

     var products = new List<Product>();
            using (var db = DbConnection)
            {
                var data = //sp call here

                //code for improvement starts here
                foreach (var row in data)
                {
                    foreach (var col in row)
                    {
                        if (col.Key == "prodname")
                        {
                            var product = new Product
                            {
                                DisplayResult = col.Value
                            };
                            products.Add(product);
                            break; //skip the remaining columns
                        }
                    }
                }
                //to here
            }

        return products;

ожидаемый результат будет:продукты [0] .DisplayResult = "образец продукта"

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Вы, похоже, упускаете самую неотразимую особенность Dapper;он отобразит Продукты для вас

Предполагается, что он будет работать как (супер упрощенно:

class Product{
  int ID;
  string Name;
}

И если ваши имена столбцов в БД не совпадают, то вы используете их псевдоним в запросе:

using(con = ...){
  var prodList = con.Query<Product>("select prodid as ID, prodname as Name from products where prodid between @a and @b", new{ a = 1, b = 100});
}

Вот и все: dapper запускает запрос и генерирует бесчисленное множество продуктов без "строка за строкой, если столбец тогда ..."

Как выпри использовании sp у вас есть проблема в том, что вы не можете использовать псевдонимы для ваших столбцов, но вы можете либо:

  • использовать технику для сопоставления имен столбцов с вашими свойствами - Вручную сопоставлять имена столбцов с помощью свойств класса
  • запустите sp и примите ienumerable анонимного типа со свойствами, названными так, как sp выводил их (вы сейчас делаете что-то подобное), а затем используйте LINQ select для создания ваших продуктов;что-то вроде con.Query("spname", ..params..).Select(e => new Product(){ ID = e.prodid, Name = e.prodname})
  • не используйте sp; выбирайте из таблиц и псевдонимы столбцов, чтобы соответствовать вашим свойствам (больше похоже на то, как dapper был предназначен для использования)
0 голосов
/ 22 октября 2019

Приведите строку к словарю и получите доступ по имени столбца.

var data = (IDictionary<string,object>)row;
object value = data["prodname"];
...