2012-03-28 23 views
5

मेरे वस्तु पदानुक्रम इस तरह है के भीतर एक क्षेत्र अद्यतन करें। मैं यह कोशिश कर रहा हूं, यह काम नहीं करता है।LINQ जहां खंड

detail.Rows.ForEach(r => r.Columns.Where(c => c.Name.ToLower().Equals("id")).ToList<Column>().Select(c => c.IsUpdated = true)); 
+0

'LINQ' विधियां 'रीडोनली'' IENumerable' लौटाती हैं, इसका उपयोग मूल्यों को बदलने के लिए नहीं किया जाना चाहिए। – gdoron

+0

http://stackoverflow.com/questions/823532/apply-function-to-all-elements-of-collection-through-linq – mellamokb

उत्तर

7

LINQ का दर्शन साइड इफेक्ट्स नहीं है। यही कारण है कि इस उद्देश्य पर यह आपके लिए ऐसा करना आसान नहीं बनाता है। आप यह कर सकता है या तो एक क्लासिक

var cols = details.Rows.SelectMany(r => r.Columns) 
         .Where(c => c.Name.ToLower().Equals("id")); 
foreach(var col in cols) { 
    col.IsUpdated = true; 
} 

साथ या List.ForEach का उपयोग करके, लेकिन एक अलग तरीके से:

details.Rows.SelectMany(r => r.Columns) 
      .Where(c => c.Name.ToLower().Equals("id")).ToList() 
      .ForEach(c => { c.IsUpdated = true }); 
+0

अरे जॉन। तो अगर आप किसी कारण से हजारों पंक्तियों को अपडेट करने की ज़रूरत है तो आप क्या करते हैं? आइए कहें कि ऑपरेटर एक बटन पर क्लिक करता है और फिर आपको उन सभी पंक्तियों को अपडेट करना होगा जिनके पास स्थिति "x" स्थिति "वाई" है जो सामान्य SQL द्वारा आसान और तेज़ है। सही? लेकिन अगर आप सबकुछ स्मृति में लोड करते हैं, तो यह हमेशा के लिए लेता है :(क्या मुझे इसके बजाय एक स्टोर्डप्रोसेडर लिखना चाहिए? क्या कोई बेहतर तरीका है? एसक्यूएल: tblData सेट स्थिति = 'y' अपडेट करें जहां स्थिति = 'x' –

0

आप (हालांकि यह किया जा सकता है, this question देखें) LINQ के साथ एक संग्रह के सभी तत्वों को उत्परिवर्तित नहीं करना चाहिए। यह एक वेनिला foreach का उपयोग करने के लिए सरल और अधिक पठनीय है।

foreach (var row in detail.Rows) 
    foreach (var col in row.Columns) 
     if (c.Name.ToLower().Equals("id")) 
      c.IsUpdated = true; 
1

LINQ वास्तव में, क्वेरी करने डेटा के लिए है डेटा के भीतर मूल्यों में परिवर्तन नहीं। आप एक पूरी नई विस्तार आइटम बनाना चाहते हैं, आप ऐसा कर सकता है:

var newDetail = new Detail 
    { 
     Rows = detail.Rows.Select(r => new Row 
              { 
               Columns = r.Columns.Select(c => new Column { Name = c.Name, IsUpdated = c.Name.ToLower() == "id" ? true : c.IsUpdated }).ToList() 
              }) 
          .ToList() 
    }; 

ध्यान दें कि ऊपर क्लीनर, सबसे अधिक संभावना हो सकता है, अगर आप अपने प्रकार के लिए निर्माताओं जोड़ा है, साथ ही।

कहा कि किया जा रहा है, अगर आप जगह में इसे अपडेट करना, जैसे आप दिखा रहे थे, मैं सिर्फ छोरों का प्रयोग करेंगे:

foreach(var row in detail.Rows) 
    foreach(var col in row.Columns) 
     if (col.Name.ToLower() == "id") 
      col.IsUpdated = true; 

मुझे लगता है कि काफी आसान का पालन करने, विशेष रूप से इस मामले में पाते हैं।

0

मैं बस इसे इस तरह काम करने के लिए मिला है। क्या यह अक्षम है? इसके बजाय। मैं रखता हूँ। कोई भी। यह काम करता है, लेकिन मुझे यकीन नहीं है कि यह एक बड़े डेटा पर अक्षम है या नहीं। यदि हां, तो मैं एक जवाब के साथ जा सकता हूं।

detail.Rows.ForEach(r => r.Columns.Where(c => c.Name.ToLower().Equals("id")).ToList<Column>().Any(c => c.IsUpdated = true)); 
+1

यह काम नहीं किया क्योंकि चुनें() का आभारी मूल्यांकन किया गया है, और कोई भी() लालची है। यह वास्तव में वास्तव में एक बुरा विचार है! लिंक क्वेरीज़ से साइड इफेक्ट्स * सबसे खराब अभ्यास * ओह, और अपना प्रश्न संपादित करें, जानकारी जोड़ने के लिए उत्तर पोस्ट न करें। – asawyer

0

इसे आज़माएं। इसे "IsUpdated" को उसी अवधारणा के साथ अपडेट करना चाहिए जिसे आप पहले से उपयोग करने का प्रयास कर रहे थे।

detail.Rows.ForEach(r => r.Columns.Where(c => c.Name.ToLower().Equals("id")).ToList<Column>().Select(c => {c.IsUpdated = true; return c;})); 
संबंधित मुद्दे