我的ASP.Net MVC应用程序需要执行一个存储过程,以便根据一组参数检查重复的工作订单。存储过程庞大而复杂,因此将其转换为Linq到SQL查询是不可能的。另外,我们不使用实体数据模型(,EDMX)文件;我们只有域模型、视图模型和数据上下文。存储过程具有以下签名:
CREATE PROCEDURE [dbo].[spGetDupWOs]
-- Add the parameters for the stored procedure here
@ProjectName VARCHAR(200) = '""',
@City VARCHAR(100) = '',
@State VARCHAR(100) = '',
@ProjectNumber VARCHAR(50) = '',
@County VARCHAR(50) = '',
@Customer VARCHAR(400) = '',
@QuoteRecipients VARCHAR(400) = NULL,
@ProjectID BIGINT = NULL
...
SELECT DuplicateID, ProjectNameMatchRank, ProjectNameMatch, ProjectName ...我试着在我的控制器里叫它,比如:
IEnumerable<DuplicateProjects> duplicateCheckResults = db.Database.SqlQuery< DuplicateProjects>("spGetDupWOs", new { ProjectName = ProjectName, City = City, State = propal.State, ProjectNumber = ProjectNumber, County = County, Owner = Owner, BID_QuoteRecipients = QuoteRecipients, ProjectID = -1 });当我运行这样的异常时,得到一个异常:
对象类型<>f__AnonymousType6`8不存在映射[ System.String、mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089、System.String、mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089、System.String、mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089、System.String、mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089、PublicKeyToken=b77a5c561934e089、System.String、mscorlib、mscorlib、,System.String、mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089、System.Int32、mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089]到已知的托管提供者原生类型。
我做错了什么?
更新:当我将所有传递的参数更改为ObjectParamter时,仍然会收到相同的错误消息。
更新2:
我对代码做了一些重构。下面是它现在的样子:
List<SqlParameter> spl = new List<SqlParameter>();
var ProjectNameParameter = new SqlParameter("ProjectName", project.ProjectName);
spl.Add(ProjectNameParameter);
var CityParameter = new SqlParameter("City", project.City);
spl.Add(CityParameter);
var StateParameter = new SqlParameter("State", project.State);
spl.Add(StateParameter);
var ProposalNumberParameter = new SqlParameter("ProjectNumber", project.ProjectNumber);
spl.Add(ProposalNumberParameter);
var CountyParameter = new SqlParameter("County", project.County);
spl.Add(CountyParameter);
var OwnerParameter = new SqlParameter("Owner", project.Owner);
spl.Add(OwnerParameter);
var BidRecipientParameter = QuoteRecipients != null ?
new SqlParameter("QuoteRecipients", QuoteRecipients) :
new SqlParameter("QuoteRecipients", "");
spl.Add(BidRecipientParameter);
var ProjectIDParameter = new SqlParameter("ProjectID", typeof(long));
spl.Add(ProposalIDParameter);
IEnumerable<DuplicateProposals> duplicateCheckResults = db.Database.SqlQuery<DuplicateProposals>("spGetDupWOs ProjectName = {0} City = {1}, State = {2}, ProjectNumber = {3}, County = {4}, Owner = {5}, QuoteRecipients = {6}, ProjectID = {7}",
spl.ToArray());现在我得到了错误:
SqlParameter已经包含在另一个SqlParameterCollection中。
发布于 2017-03-08 18:16:10
查询字符串之后的SqlQuery<T>的进一步参数构成了一个参数数组,该方法将使用这个数组来用编号参数参数来回填查询字符串,就像String.Format一样。由于您传递的是一个匿名对象,所以该方法试图将其作为单个参数来处理,并且无法将其转换为字符串。因此,是的,您需要使用SqlParameter手动添加params,或者更改调用以与此方法兼容的方式处理它:
db.Database.SqlQuery< DuplicateProjects>(
"spGetDupWOs @ProjectName = {0}, @City = {1}, @State = {2}, @ProjectNumber = {3}, @Country = {4}, @Owner = {5}, @BID_QuoteRecipients = {6}, @ProjectID = {7}",
ProjectName,
City,
propal.State,
ProjectNumber,
County,
Owner,
QuoteRecipients,
-1
);增加了自由间距以提高可读性。
https://stackoverflow.com/questions/42677453
复制相似问题