Насколько я вижу, проблем с Dapper и несколькими параметрами нет. Вот тестовый код, который я создал:
class Program
{
static void Main(string[] args)
{
SqlConnection c = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=tempdb;Data Source=.\SQLEXPRESS");
c.Execute(@"
CREATE PROCEDURE GetPerson(
@N VARCHAR(10),
@A INT,
@S INT
)AS
BEGIN
SELECT @N as Name, @A as Age, @S as Salary;
END;");
//works
var p = c.Query<Person>("GetPerson", new { A = 1, N = "John", S = 1000 }, commandType: System.Data.CommandType.StoredProcedure);
//doesn't work, "procedure expects parameter @A which was not supplied"
int i = 2, j = 2000; string n = "Frank";
var q = c.Query<Person>("GetPerson", new { i, n, j }, commandType: System.Data.CommandType.StoredProcedure);
//works
int A = 3, S = 3000; string N = "Joe";
var r = c.Query<Person>("GetPerson", new { S, A, N }, commandType: System.Data.CommandType.StoredProcedure);
//works
DynamicParameters dp = new DynamicParameters();
dp.Add("@A", 4);
dp.Add("@N", "Derek");
dp.Add("@S", 4000);
var s = c.Query<Person>("GetPerson", dp, commandType: System.Data.CommandType.StoredProcedure);
DynamicParameters dp2 = new DynamicParameters();
dp2.Add("A", 5);
dp2.Add("N", "Tim");
dp2.Add("S", 5000);
var t = c.Query<Person>("GetPerson", dp2, commandType: System.Data.CommandType.StoredProcedure);
}
}
class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
Все запросы, которые //works
возвращают список из 1 человека. Выходной столбец Salary по запросу не представлен в классе Person, поэтому он просто теряется.
Ключевые выводы из этого:
- Dapper обладает гибкостью в отношении того, как он принимает параметры
- Важное значение имеет имя параметра
- Дапперу плевать на @ в имени параметра
- столбцы запроса, которые не имеют соответствующего свойства в строгом классе, не представлены
И, как вы определили, это последний, который был критическим в вашем случае; Ваш запрос не выводил столбцы с именами, которые соответствуют объекту ваших заказов