LINQ

2011-03-15 15 views
17

का उपयोग कर संग्रह में किसी संपत्ति को क्वेरी और अपडेट करना LINQ का उपयोग करके संग्रह के भीतर किसी विशिष्ट आइटम की एक एकल संपत्ति को अपडेट करने का सबसे शानदार/सरल तरीका क्या है?LINQ

उदाहरण के लिए अगर मैं निम्नलिखित की एक सूची है:

public class Ticket 
{ 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public bool Selected { get; set; } 
} 

मैं LINQ wheres अपने "नाम" एक टिकट आइटम के "चयनित" संपत्ति अद्यतन करने के लिए उपयोग कर सकते हैं कैसे संपत्ति "बीच का महत्व है "। एसक्यूएल में यह होगा:

UPDATE Tickets SET Selected = true WHERE Name = 'Beach' 

मैंने सोचा कि मैं इस के साथ सही रास्ते पर था ...

tickets.Select(x => { x.Selected = true; return x; }).ToList().Where(x => x.Name == "Beach"); 

उत्तर

27

आप क्रम बदल सकते हैं, तो foreach ऑपरेटर का उपयोग करें:

tickets 
    .Where(x => x.Name == "Beach") 
    .ToList() 
    .ForEach(x => { x.Selected = true; }); 

नोट:

  • कि ToList() क्योंकि IEnumerable की जरूरत है Linq में foreach का समर्थन नहीं करता - LINQ equivalent of foreach for IEnumerable<T>
  • कि पठनीयता के लिए यह बेहतर हो सकता है अगर यह LINQ-करने के लिए है यह पता एक LINQ क्वेरी और उसके बाद में एक और अधिक परंपरागत foreach(x in list) सी # पाश
  • अलग करने के लिए देख -एसक्ल, तो आपको अपने परिवर्तनों को जारी रखने के लिए SubmitChanges() पर कॉल करने की आवश्यकता होगी।
+1

क्यों ToList()? यकीन है कि यह ओपी में था, लेकिन यह शायद अनावश्यक उपरि है। –

+0

कारण है - http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet – Stuart

+0

'IENumerable'' .EEach() 'का समर्थन नहीं करता है, इसलिए इसकी आवश्यकता है। – BrokenGlass

1

मुझे यह कहकर शुरू करना है, इस तरह की संपत्तियों को सेट करने के लिए LINQ का उपयोग न करें, ऐसा नहीं है कि LINQ का उपयोग कैसे किया जाना चाहिए।

आप पंक्तियों को बदलने के लिए क्वेरी लिखने के लिए क्वेरी लिखें, उन्हें लूप में बदलें, और डेटाबेस में परिवर्तन सबमिट करें (यदि LINQ से SQL)। एक जवाब के लिए

var query = tickets.Where(ticket => ticket.Name == "Beach"); 
foreach (var item in query) 
    item.Selected = true; 

// if LINQ to SQL 
context.SubmitChanges(); 
+6

जेफ, कृपया आप एक कारण बता सकते हैं कि आपको लगता है कि LINQ इस तरह से उपयोग नहीं किया जाना चाहिए? ForEach() आपके फ़ोरैच लूप के समान ही वही कर रहा है। – IsolatedStorage

+0

@IsolatedStorage ForEach LINQ का हिस्सा नहीं है ... कारण किसी को वास्तव में उम्मीद नहीं है कि मौजूदा ऑब्जेक्ट्स को अपडेट करने के लिए कहां/चुनें/कोई/सभी - परिणामस्वरूप भ्रम पैदा हो जाएगा ... देरी निष्पादन इसे और भी मनोरंजक बनाता है। –

8

थोड़ी देर हो चुकी है, लेकिन मुझे लगता है कि हम ToList() कन्वर्ट करने के लिए के रूप में स्टुअर्ट द्वारा उल्लेख नहीं है क्या वास्तव में हम कर सकते हैं बस निम्नलिखित

के रूप में स्टुअर्ट कोड (जो कोड के महान टुकड़ा है) tweak है
tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => x.Selected = true); 

एक अन्य विकल्प

tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => { x.Selected = true; return true; }); 
संबंधित मुद्दे