Полагаю, у вас есть таблица расходов с соотношением 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