Даппер вопрос. Получение значений из возвращаемого объекта - PullRequest
2 голосов
/ 22 октября 2019

Только начал изучать Dapper. У меня есть фон ADO.NET. Используя загруженную демонстрацию, я могу вставлять / удалять данные из веб-формы в таблицу MySql. Это, однако, я искал все утро.

При извлечении одной строки из БД по идентификатору, он не возвращает LIST <>, он кажется просто объектом (с использованием кода издемо я скачал). Запрос работает, я получаю объект обратно. В нем есть поля: «ProductID, Description и Price».

Единственный способ получить значения для этих трех полей был следующим:

System.Reflection.PropertyInfo pi = Product.GetType().GetProperty("ProductID");
System.Reflection.PropertyInfo desc = Product.GetType().GetProperty("Description");
System.Reflection.PropertyInfo price = Product.GetType().GetProperty("Price");

int _ProductID = (int)(pi.GetValue(Product, null));
string _Description = (string)(desc.GetValue(Product, null));
decimal _Price = (decimal)(price.GetValue(Product, null));

Это работает и получает правильные значения. значения для этих трех полей.

Я привык циклически перебирать DataTables, но я просто думаю, что, вероятно, есть лучший способ получить эти значения.

Это правильный способ сделать это или я что-то упустил? Я действительно прочитал документацию и связался с этим все утро, прежде чем спрашивать тоже.

Некоторые вещи, на которые я смотрел, кажутся очень сложными. Я думал, что Даппер должен был упростить вещи.

Ответы [ 2 ]

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

ОК, спасибо, Марк. Мне было трудно увидеть, что должно быть в файлах класса Dapper и что должно быть в моем коде позади. Первоначальный демонстрационный способ получения товара по идентификатору имел запрос: .FirstOrDefault ();

Я изменил все, чтобы вернуть список <>, и все заработало. Я уверен, что мой ADO.NET показывает, но это работает. В файлах класса Dapper:

 public List<Product> ProductAsList(int Id)
        {
            return this._db.Query<Product>("SELECT * FROM Cart_product WHERE ProductID=@Id", new { Id = Id }).**ToList()**;
        }

Это просто получение одной строки, которая соответствует ProductID.

В коде страницы:

protected void CartItemAdd(string ProductId) // passing it the selected ProductID
    {

        var results = cartservice.ProductAsList(Convert.ToInt32(ProductId));

// возвращает эту строкуиспользование Dapper ProductAsList (ProductId)

        int _ProductId = 0;
        string Description = string.Empty;
        decimal Price = 0;

// Прокручивание списка и получение значения каждого элемента:

        foreach (Product obj in results)
        {
            _ProductId = obj.ProductID;
            Description = obj.Description;
            Price = obj.Price;
        }

// Использование Dapper для вставки выбранного товара в покупкикорзина (таблица):

        String UserName = "jbanks";

        cartitem = new CartItem();
        cartitem.ProductID = _ProductId;
        cartitem.Quantity = 1;
        cartitem.Description = Description;
        cartitem.Price = Price;
        cartitem.Created = DateTime.Now;
        cartitem.CreatedBy = UserName;
        result = cartservice.AddCartItem(cartitem);

        if (result)
        {
            lblMessage.Text = string.Empty;
            lblMessage.Text = "Successfully added a cart item";
        }
    }


}

Она действительно ищет продукт из одной таблицы и вставляет выбранный элемент в другую таблицу.

Еще раз спасибо!

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

Основной Query<T> API возвращает IEnumerable<T>, который часто будет a List<T>;метод расширения AsList<T>() может вернуть его обратно в список без копирования, но в любом случае: они просто T, для любого T, который вы просили. Если вы запросили Query<Product>, то: это должны быть Product экземпляры :

var results = connection.Query<Product>(someSql, someArgs); // perhaps .AsList()
foreach (Product obj in results) { // "var obj" would be fine here too
    // now just use obj.ProductID, obj.Description and obj.Price
}

Если это не сработало: убедитесь, что вы использовали версию <T>Query. Существует также неуниверсальный вариант, который возвращает dynamic. Честно говоря, вы почти всегда должны использовать версию <T>.

Примечание: я предполагаю , что где-то у вас есть что-то вроде

class Product {
    public int ProductID {get;set;}
    public string Description {get;set;}
    public decimal Price {get;set;}
}
...