2009-06-01 12 views
35

मैं LINQ में मामला बयानों के साथ कुछ मदद की ज़रूरत है (ग #):LINQ मामले बयान

osc_products.products_quantity = 
     CASE 
     WHEN itempromoflag <> 'N' THEN 100000 
     WHEN itemcat1 IN ('1','2','31') AND itemsalestatus = 'S' THEN 100000 
     WHEN itemsalestatus = 'O' THEN 0 
     ELSE cds_oeinvitem.itemqtyonhand - cds_oeinvitem.itemqtycommitted 
     END 

LINQ में कनवर्ट करने पर मेरे शुरू, (मैं अभी भी सीख रहा हूँ):

cdsDBDataContext db = new cdsDBDataContext(); 
    var query = from items in db.cdsItems 
       where items.ItemHandHeldFlag.Equals("Y") && 
       items.ItemQtyOnHand - items.ItemQtyCommitted > 0 
    select items; 

यह क्वेरी उत्पादन से एक वाणिज्य साइट पर स्टॉक स्थिति अद्यतन करता है।

+0

कोड ब्लॉक आदमी – Chance

उत्तर

84

तो इसकी सिर्फ मामलामें बयान LINQ अपने के बाद (अपनी टिप्पणी पढ़ने के लिए) तो इस का एक उदाहरण है ...

Int32[] numbers = new Int32[] { 1, 2, 1, 3, 1, 5, 3, 1 }; 

var numberText = 
(
    from n in numbers 
    where n > 0 
    select new 
    { 
     Number = n, 
     Text = 
     (
      n == 1 ? "One" : 
      n == 2 ? "Two" : 
      n == 3 ? "Three" : "Unknown" 
     ) 
    } 
); 
1

सबसे पहले, उन आइटम्स का चयन करें जिन्हें आप अपडेट करना चाहते हैं। फिर, उन्हें नियमित सी # में अपडेट करें। तबदीली भेजे।

var q = from osc in MyDataContext.osc_products 
      join cds in cds_oeinvitem on osc.products_model equals cds.itemno into p 
      where osc.Itemwebflag == 'Y' 
      select p; 

    foreach (var item in q) 
    { 
     if (item.itempromoflag != "N") 
      item.products_quantity = 100000; 
     else if ((new[] { 1, 2, 31 }.Contains(item.itemcat1)) && (item.itemsalestatus == 'S')) 
      item.products_quantity = 100000; 
     else if (item.itemsalestatus == 0) 
      item.products_quantity = 0; 
     else 
      item.products_quantity = item.itemqtyonhand - item.itemqtycommitted; 
    } 

    MyDataContext.SubmitChanges(); 
+0

अजीब हममम ... यह लग रहा है ... –

0

आप थोक अद्यतन कर रहे हैं, लेकिन लिंक पूरी तरह से एक क्वेरीिंग और ऑब्जेक्ट चयन टूल है। नौकरी के लिए उचित उपकरण का उपयोग करें ... जो इस मामले में निश्चित रूप से डेटाबेस सर्वर है।

+0

नहीं वास्तव में, यह अब एक्सएमएल के लिए उदासीनता का उपयोग करें, मैं एसक्यूएल बयान छोड़ चाहते हैं कि अगर मामला था !!, यह भी एक पूरा एसक्यूएल नहीं है कथन, यह sql2005 से अपडेट हो रहा है -> mysql –

+0

ठीक है, इस पर ध्यान दिए बिना कि कितने डेटाबेस सर्वर शामिल हैं या ऐसा कुछ भी ... अगर अद्यतन विवरण (खंड या अन्यथा) आप क्या करने की कोशिश कर रहे हैं ... यह निश्चित रूप से एक थोक है काम। या मैपर्स (जो कि LINQ से SQL है) को मानचित्रण के संबंध में ऑब्जेक्ट को संभालने के लिए डिज़ाइन किया गया है। वे थोक प्रसंस्करण को संभालने के लिए डिज़ाइन नहीं किए गए हैं, और इस तरह के संचालन के प्रदर्शन को गंभीर रूप से प्रभावित कर सकते हैं। उपकरण को थोक प्रसंस्करण छोड़ना सबसे अच्छा है जो उन्हें सबसे अच्छा करता है ... जो, अधिकांश समय डेटाबेस डेटाबेस (या आपके मामले में, दो सर्वर) है। – jrista

+0

ठीक है, अच्छी जानकारी है, लेकिन मैं थोक अद्यतन नहीं कर रहा हूं , मैंने स्पष्टता के लिए इसे हटा दिया –

1

संग्रहीत प्रक्रिया में अपने एकल अद्यतन विवरण का उपयोग करें, एप्लिकेशन सर्वर पर अद्यतनों का एक लूप करने से बेहतर होगा।

+0

का चयन करें तो आप कह रहे हैं कि इस समस्या के लिए linq का उपयोग न करें? –

+0

@ नाथन कोओप, यदि आपकी डीबी एक्सेस linq के माध्यम से है, तो प्रक्रिया को कॉल करने के लिए linq का उपयोग करें। सेट आधारित अद्यतन बनाम का प्रदर्शन अंतर।एक लूपिंग linq अद्यतन महत्वपूर्ण होगा –

+0

सही के बारे में लगता है, धन्यवाद, मैं linq भी सीख रहा हूँ। –

0

Linq में कोई "अपडेट" बयान नहीं है (जो भी स्वाद जो आप उपयोग करते हैं, चाहे वह LinqToSQL या LinqToEntities हों)।

लिंक सख्ती से एक पूछताछ भाषा प्रदान करता है।

यदि आप LinqToSQL का उपयोग कर रहे हैं और डेटा अपडेट करना चाहते हैं, तो आपको उन आइटम्स के संदर्भ में पहली बार पूछताछ की आवश्यकता है जिन्हें आप अपडेट करना चाहते हैं, फिर उन्हें अपनी संपत्ति बदलने के लिए लूप करें और अंत में डेटाबेस में परिवर्तनों को सहेजने के लिए सबमिटChanges को कॉल करें ।

+0

मुझे LINQ में CASE Equiv सीखने में मदद की ज़रूरत है, मैंने अपना प्रश्न संपादित किया है और अद्यतन –

3

यहाँ अब तक मेरी प्रगति है, सब पर अभी तक काम नहीं कर रहा है, लेकिन एक शुरुआत है:

var query2 = from items in db.cdsItems 
      where items.ItemTrackingCode.Equals("A") && (items.ItemQtyOnHand - items.ItemQtyCommitted) > 0 
      select new { 
          items, 
          qty = 
           (
            items.ItemPromoFlag.Equals("1") ? "100000" : 
            items.ItemCat1.Equals("1") ? "100000" : 
            items.ItemSaleStatus.Equals("O") ? "0" : 
            (items.ItemQtyOnHand - items.ItemQtyCommitted).ToString 
           ) 
         }; 

इस वाक्य रचना मेरे लिए बहुत अजीब लगता है ... मैं सिर्फ पारित होना एसक्यूएल हो सकता है।

+0

को कैसे हटाया है? items.ItemPromoFlag.Equals ("1") ! = –

+0

आइटम काम नहीं करता है। ItemPromoFlag! = "1" –

+0

@ स्कॉट: मुझे लगता है कि आपको equals() के बजाय == और! = ऑपरेटरों का उपयोग करना चाहिए। यह और अधिक पठनीय तरीका है। –

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