मुझे अक्सर डेटाबेस में किसी विशेष रिकॉर्ड में एकाधिक आइटम लोड करना पड़ता था। उदाहरण के लिए: एक वेब पेज एक रिपोर्ट के लिए शामिल करने के लिए आइटम प्रदर्शित करता है, जिनमें से सभी डेटाबेस में रिकॉर्ड हैं (रिपोर्ट रिपोर्ट तालिका में एक रिकॉर्ड है, आइटम आइटम तालिका में रिकॉर्ड हैं)। एक उपयोगकर्ता वेब ऐप के माध्यम से एक ही रिपोर्ट में शामिल करने के लिए आइटम का चयन कर रहा है, और मान लीजिए कि वे 3 आइटम का चयन करें और जमा करें। प्रक्रिया इन 3 आइटमों को ReportItems (ReportId, ItemId) नामक तालिका में रिकॉर्ड जोड़कर इस रिपोर्ट में जोड़ देगी। संग्रहित प्रक्रिया मेंउत्तीर्ण सूची <> एसक्यूएल संग्रहीत प्रक्रिया
public void AddItemsToReport(string connStr, int Id, List<int> itemList)
{
Database db = DatabaseFactory.CreateDatabase(connStr);
string sqlCommand = "AddItemsToReport"
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
string items = "";
foreach (int i in itemList)
items += string.Format("{0}~", i);
if (items.Length > 0)
items = items.Substring(0, items.Length - 1);
// Add parameters
db.AddInParameter(dbCommand, "ReportId", DbType.Int32, Id);
db.AddInParameter(dbCommand, "Items", DbType.String, perms);
db.ExecuteNonQuery(dbCommand);
}
और इस:
वर्तमान में, मैं कुछ इस तरह का कोड में करना होगा
INSERT INTO ReportItem (ReportId,ItemId)
SELECT @ReportId,
Id
FROM fn_GetIntTableFromList(@Items,'~')
कहाँ समारोह पूर्णांकों का एक एक स्तंभ तालिका देता है। वहाँ एक बेहतर तरीका कुछ इस तरह संभाल करने के लिए है:
मेरा प्रश्न है? ध्यान दें, मैं डेटाबेस सामान्यीकरण या उसके जैसा कुछ भी नहीं पूछ रहा हूं, मेरा प्रश्न विशेष रूप से कोड से संबंधित है।
कि वास्तव में संयोजन से आप को बचाने के लिए जा रहा है? क्या आपको पता है कि स्ट्रिंगबिल्डर का उपयोग करके विधि लागू की गई थी? –
हां, यह आपको concatenation से बचाएगा। String.Join एक असुरक्षितखफर का उपयोग करने के लिए कॉन्सट (रिफ्लेक्टर में इसे देखें) का उपयोग करता है। जहां तक LINQ चला जाता है, यह सिर्फ ToString() को कॉल करने वाली सूची में उल्लिखित है, जो अपरिहार्य है, और एक सरणी बना रहा है। सरणी निर्माण महंगा हो सकता है। –
मुझे नहीं पता था कि आप इसे ऐसा कर सकते हैं, टिप के लिए धन्यवाद! –