2012-05-11 17 views
16

में DbSet.SqlQuery विधि को पैरामीटर कैसे पास करें I Entity Framework में एक रॉ SQL कथन निष्पादित करने का प्रयास कर रहा हूं जो कुछ पैरामीटर लेता है। पैरामीटर [] पैरामीटरएंटिटी फ्रेमवर्क

यह मेरा कोड यहाँ खंड है आपत्ति: विधि मैं उपयोग कर रहा हूँ DbSet.SqlQuery

मैं कैसे पैरामीटर वस्तु सरणी का निर्माण करने पर उलझन में हूँ से है

public ActionResult APILocation(string lat, string lng) 
{ 
    string SQL = "select * from (select Distance = ((ACOS(SIN(@lat * PI()/180) * SIN(lat * PI()/180) + COS(@lat * PI()/180) * COS(lat * PI()/180) * COS((@lng - Long) * PI()/180)) * 180/PI()) * 60 * 1.1515) from dbo.Stores) t where Distance < 10 order by Distance asc"; 
      ObjectParameter latParam = new ObjectParameter("lat", lat); 
      ObjectParameter lngParam = new ObjectParameter("lng", lng); 

      object[] parameters = new object[] { latParam, lngParam }; 

      var stores = db.Stores.SqlQuery(SQL, parameters); 

      return Json(stores, JsonRequestBehavior.AllowGet); 
     } 

मैं बनाने की कोशिश की ऑब्जेक्ट पैरामीटर और इसे ऑब्जेक्ट सरणी में डाल दिया लेकिन यह काम नहीं किया। क्या कोई इस पर एक उदाहरण प्रदान कर सकता है कि मुझे पैराम्स ऑब्जेक्ट कैसे बनाना चाहिए [] पैरामीटर

धन्यवाद! फ्ली

उत्तर

16

मैंने अपनी विधि के पैरामीटर को साफ करने के लिए समाप्त कर दिया ताकि वे मेरे डेटाबेस कॉलम के समान न हों जो कि बहुत स्पष्ट नहीं था। ऑब्जेक्ट पैरामीटर @ प्रतीक का समर्थन नहीं करता है, इसलिए यह काम नहीं करता है। मैं निम्नलिखित समाधान के साथ समाप्त हो गया:

public ActionResult APILocation(string latitude, string longitude) 
{ 

string SQL = "select * from (select *, Distance = ((ACOS(SIN({0} * PI()/180) * SIN(lat * PI()/180) + COS({0} * PI()/180) * COS(lat * PI()/180) * COS(({1} - long) * PI()/180)) * 180/PI()) * 60 * 1.1515) from dbo.Parish) t where Distance < 10 order by Distance asc"; 

    SqlParameter latParam = new SqlParameter("lat", latitude); 
    SqlParameter lngParam = new SqlParameter("long", longitude); 
    object[] parameters = new object[] { latParam , lngParam }; 

    var stores = db.Store.SqlQuery(SQL, parameters); 

     return Json(stores, JsonRequestBehavior.AllowGet); 

} 

मैं अपने उप चयन में * चयन करने के लिए है क्योंकि यह जो इसे बाद से मैं केवल एक कॉलम और नहीं सब कुछ लौट रहा था नहीं कर सकता मेरी संस्था को मैप करने के लिए कोशिश कर रहा था था । यह समाधान मेरे लिए काम साबित हुआ!

अंत में, पूरी वस्तु [] पैरामीटर इस तरह किया जा सकता है:

SqlParameter latParam = new SqlParameter("latitude", latitude); 
SqlParameter lngParam = new SqlParameter("longitude", longitude); 
object[] parameters = new object[] { latitude, longitude }; 

धन्यवाद hwcverwe आपकी मदद के लिए।

पिस्सू

+26

आपकी पोस्ट का कोई मतलब नहीं है। आप अपने पैरामीटर नाम "अक्षांश" और "देशांतर" देते हैं लेकिन वास्तविक क्वेरी में आप "lat" और "Long" का उपयोग करते हैं। इसके अलावा आप एसकल्प पैरामीटर "लैटपाराम" और "एलएनजी पैराम" नाम देते हैं लेकिन आप बाद में उनका उपयोग नहीं करते हैं। – Kugel

+1

जो लोग सोचते हैं कि पैरामीटर को सही तरीके से परिभाषित और उपयोग कैसे करें: एसक्यूएल '' @YourParamName का चयन करें '' कोड में, नया SqlParameter ("YourParamName", 12345); ' – Monsignor

7

ऊपर उत्तर सही हैं लेकिन SqlQuery के लिए हस्ताक्षर के बाद से है SqlQuery (एसक्यूएल: स्ट्रिंग, पैरामीटर [] पैरामीटर वस्तु), तो आप कोड को सरल बनाने और का उपयोग करके इसे एक और अधिक प्राकृतिक लग रहा है दे सकते हैं:

context.SqlQuery(sql, latParam, lngPara); 

यह पहले इसे सरणी किए बिना पूरी तरह कानूनी होगा।

संबंधित मुद्दे