No mapping exists from object type System.Collections.Generic.List when executing stored proc with parameters in EF 4.3

人走茶凉 提交于 2019-11-30 07:59:07

You need to pass each parameter to the method (ie You can't pass a list)

IList<XXXViewModel> XXXList =
     _context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", 
     new SqlParameter("param1", param1Value), 
     new SqlParameter("param2", param2Value)).ToList();

In case someone else comes across this...

I created the parameters as a List and then in the SqlQuery call I passed it with a .ToArray(). Worked for me. Here's the modified code below...

var parameters = new List<object>(); 
parameters.Add(new SqlParameter("param1", param1Value)); 
parameters.Add(new SqlParameter("param2", param2Value)); 
IList<XXXViewModel> XXXList = 
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", parameters.ToArray()).ToList(); 

The solution for this problem (in my case was)

 var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms);

Where query was a string that had parameters inserted such as @Name etc. The parms variable was a List of SQLParameters. SQL doesn't like generic lists....

SQL must have an array of SQLParameters sent as and object[] and not a list of generic type.

var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());

In my case parameter's SQL type and handling null values solved this problem. It was throwing same exception No mapping exists from object type System.RuntimeType to a known managed provider native type. for this also

var parameter1 = new SqlParameter("parameter1", typeof(string));
var parameter2 = new SqlParameter("parameter2", typeof(string));
var parameter3 = new SqlParameter("parameter3", typeof(string));

parameter1.Value = string.IsNullOrEmpty(parameter1Value) ? (object)DBNull.Value : parameter1Value;
parameter2.Value = string.IsNullOrEmpty(parameter2Value) ? (object)DBNull.Value : parameter2Value;
parameter3.Value = string.IsNullOrEmpty(parameter3Value) ? (object)DBNull.Value : parameter3Value;

http://karim-medany.blogspot.ae/2014/02/no-mapping-exists-from-object-type.html

didn't state SQL Server version, but Erland Sommarskog has an article on how to use Table-Valued Parameters in SQL Server and .NET.

http://www.sommarskog.se/arrays-in-sql-2008.html

Able to pass a variable amount of arguments from client using a single parameter.

Manoj Kumar Bisht

If the stored procedure is only for update/insert, the following can be used as well.

string cmd = Constants.StoredProcs.usp_AddRoles.ToString() + " @userId, @roleIdList";
int result = db.Database
                        .ExecuteSqlCommand
                        (
                           cmd,
                           new SqlParameter("@userId", userId),
                           new SqlParameter("@roleIdList", roleId)
                        );

You can also use string.Format to pass parameters to a stored procedure

string command = string.Format("EXEC spXXX {0},{1}", param1Value, param2Value);
IList<XXXViewModel> XXXList = 
  _context.Database.SqlQuery<XXXViewModel>(command).ToList();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!