Заполнить объект класса с помощью Dapper - PullRequest
0 голосов
/ 09 сентября 2018
public class Expenses
{
    public Category Category { get; set; }
    public PaymentModes PaymentModes { get; set; }
}

public class Category
{
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
}

public class PaymentModes
{
    public int PaymentModeID { get; set; }
    public string PaymentMode { get; set; }
}

public class ViewModel
{
   public IEnumerable<Month> Month { get; set; }
   public IEnumerable<Category> Category { get; set; }
   public IEnumerable<Expenses> Expenses { get; set; }
}

Итак, у меня есть эти классы. Теперь я хочу заполнить объект класса Expense, используя Dapper. Но я всегда получаю Category и PaymentModes как ноль. Вот результат, который я получаю из БД:

enter image description here

Вот метод получения данных о расходах:

public ViewModel FetchSummaryData(Expenses expenses)
{
    DynamicParameters param = new DynamicParameters();
    ViewModel viewModel = new ViewModel();
    param.Add("@flag", expenses.flag);
    var result = db.QueryMultiple("sp_Summary", param, commandType: CommandType.StoredProcedure);
    if (result != null)
    {
        viewModel.Category = result.Read<Category>();
        viewModel.Expenses = result.Read<Expenses>();
    }

    return viewModel;
}

enter image description here

Как вы можете видеть, Category и PaymentModes для этого конкретного ExpenseID всегда равны нулю. Как я могу заполнить свойства этих объектов, используя Dapper? Спасибо.

1 Ответ

0 голосов
/ 09 сентября 2018

Полагаю, у вас есть таблица расходов с соотношением 1: 1 с таблицами PaymentModes и Category. В этом контексте ваш sp должен вернуть все записи из таблицы «Расходы» с полями «Расходы», указанными первыми, за которыми следуют поля «PaymentModes» и, наконец, поля «Категория». Как то так

select e.*, p.PaymentModeId, p.PaymentMode, c.CategoryID, c.CategoryName
from tbl_Expenses e inner join PaymentModes p on e.PaymentModeID = p.PaymentModeID
               inner join Category c on e.CategoryID = c.CategoryID
where ......

Если у вас нет связей с таблицей PaymentModes и Category, но все хранится в одной таблице расходов, вам не нужны объединения, а просто перечисляйте все поля в правильном порядке, чтобы Dapper знал, как используйте свои поля, чтобы заполнить необходимые объекты

select ExpenseID, Price, ExpenseDate, ....., 
       PaymentModeID, PaymentMode,
       CategoryID, CategoryName
from tbl_Expenses
where ....

В любом случае вы выполняете запрос с помощью

var result = db.Query<Expenses, PaymentModes, Category, Expenses>("sp_Summary", 
             (e,p,c) => 
             {
                e.PaymentModes = p;
                e.Category = c;
                return e;
             }, splitOn: "PaymentModeID,CategoryID", param: param, commandType: CommandType.StoredProcedure);

На данный момент переменная результата - IEnumerable<Expense> с правильными PaymentModes и Категория .

Параметр splitOn позволяет Dapper знать, по какому полю следует разделить данные результатов в трех объектах, необходимых для вызова метода Query.

Таким образом, все поля до идентификатора PaymentModeID присваиваются переменной Expenses, затем поля до CategoryID переходят в переменную PaymentModes, а последние поля переменной Category передаются в лямбда-выражение.
Внутри лямбды нужно просто присвоить переменные p и c соответствующему полю переменной Expenses и удовлетворить сигнатуру Func, возвращающую переменную Expenses

...