इस मामले में, आपको कॉल नहीं करना चाहिए:
var query = ctx.Database.SqlQuery<CmdRegisterAssetDto>(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam);
लेकिन इसके बजाय कॉल करें:
var result = ctx.Database.ExecuteSqlCommand(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam);
ध्यान दें कि एकमात्र प्रभावी अंतर यह है कि SqlQuery<CmdRegisterAssetDto>
को ExecuteSqlCommand
से बदल दिया गया था . इसका मतलब यह भी है कि डीटीओ अनावश्यक है। अन्यथा, आपका कोड ऐसा लगता है कि इसे काम करना चाहिए। मेरे द्वारा उल्लिखित परिवर्तनों के साथ आपका मूल कोड यहां दिया गया है:
string projectName = "EXCO";
string location = "ANYWHERE";
string countryCode = "XX";
using (var ctx = new RAContext())
{
var projectNameParam = new OracleParameter("inProjectName", OracleDbType.Varchar2, projectName, ParameterDirection.Input);
var countryCodeParam = new OracleParameter("inCountryCode", OracleDbType.Varchar2, countryCode, ParameterDirection.Input);
var locationParam = new OracleParameter("inLocation", OracleDbType.Varchar2, location, ParameterDirection.Input);
var assetRegisteredParam = new OracleParameter("OutAssetRegistered", OracleDbType.Varchar2, ParameterDirection.Output);
var sql = "BEGIN RA.RA_RegisterAsset(:inProjectName, :inCountryCode, :inLocation, :OutAssetRegistered); END;";
var result = ctx.Database.ExecuteSqlCommand(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam);
assetRegistered = (string)assetRegisteredParam.Value;
}
अपने सिद्धांत को साबित करने के लिए, मैंने आपके द्वारा अनुभव किए जा रहे अशक्त व्यवहार को पुन:प्रस्तुत किया और फिर वह एक बदलाव किया। यह थोड़ी देर के लिए लटका हुआ था (शायद ईएफ को गियर में आने देने के लिए), लेकिन उसके बाद हर बार जल्दी से निष्पादित किया गया। प्रत्येक मामले में, मुझे आउट पैरामीटर में प्रतीक्षारत एक मान मिला।
अगर किसी को कोई परेशानी हो रही है, तो आपके लिए स्क्रिप्टिंग विवरण का ध्यान रखने वाला एक लंबा बदलाव है:
string projectName = "EXCO";
string location = "ANYWHERE";
string countryCode = "XX";
using (var ctx = new RAContext())
using (var cmd = ctx.Database.Connection.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "RA.RA_REGISTERASSET";
var projectNameParam = new OracleParameter("inProjectName", OracleDbType.Varchar2, projectName, ParameterDirection.Input);
var countryCodeParam = new OracleParameter("inCountryCode", OracleDbType.Varchar2, countryCode, ParameterDirection.Input);
var locationParam = new OracleParameter("inLocation", OracleDbType.Varchar2, location, ParameterDirection.Input);
var assetRegisteredParam = new OracleParameter("OutAssetRegistered", OracleDbType.Varchar2, ParameterDirection.Output);
cmd.Parameters.AddRange(new[] { projectNameParam, countryCodeParam, locationParam, assetRegisteredParam });
cmd.Connection.Open();
var result = cmd.ExecuteNonQuery();
cmd.Connection.Close();
assetRegistered = (string)assetRegisteredParam.Value;
}
एक बाद के विचार के रूप में, आप तकनीकी रूप से अपने मूल समाधान के साथ जा सकते हैं यदि आपने तुरंत (यानी query.FirstOrDefault()
के बाद क्वेरी को आमंत्रित किया है। ) क्वेरी का वापसी मूल्य हमेशा शून्य होगा, लेकिन आपका आउट पैरामीटर कम से कम पॉप्युलेट हो जाएगा। ऐसा इसलिए है क्योंकि EF क्वेरीज़ आस्थगित निष्पादन का उपयोग करती हैं।