![](/img/trans.png)
[英]How to get / store return value from stored procedure call in Entity Framework?
[英]Entity Framework 6 get complext return value from a stored procedure
我的 ASP.Net MVC 應用程序需要執行一個存儲過程,以便根據一組參數檢查重復的工單。 存儲過程龐大而復雜,因此將其轉換為 Linq to 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, PublicKey9CultureToken=neutral, PublicKeyToken=neutral [System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089,[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 中。
查詢字符串之后SqlQuery<T>
進一步參數構成一個params數組,該方法將使用該數組用編號的參數參數回填查詢字符串,就像String.Format
一樣。 由於您傳遞的是匿名對象,因此該方法試圖將其視為一個參數,並且無法將其轉換為字符串。 所以,是的,您要么需要使用SqlParameter
手動添加參數,要么更改您的調用以與此方法兼容的方式處理它:
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
);
添加了自由間距以提高可讀性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.