2011-11-14 7 views
15

मैं निम्नलिखित इकाई की रूपरेखा प्रश्न हैं:LINQ पहला संग्रह में मूल्यों को निर्धारित करने दो संग्रह से जुड़ें

var results = from r in db.Results 
       select r; 

मैं AutoMapper उपयोग कर रहा हूँ एक और प्रकार को मैप करने के:

var mapped = Mapper.Map<IEnumerable<Database.Result>, IEnumerable<Objects.Result>>(results); 

में मेरे ऑब्जेक्ट्स। रिसेट प्रकार, मेरे पास ऐसी संपत्ति है जिसे डेटाबेस से नहीं आ रहा है।

var reasons = new List<Reason> 
{ 
    new Reason { Id = 1, Reason = "asdf..." } 
}; 

मैं अपने मैप की संग्रह के साथ कारणों में शामिल होने और मेरी कारणों से मूल्य का उपयोग कर मेरी मैप किया संग्रह में कारण गुण सेट करने की जरूरत है: यह एक अन्य स्रोत है कि मैं मूल रूप से मेरी मैप किया प्रकार में वापस से पॉप्युलेट करने से आ रही है संग्रह। क्या यह संभव है?

// need something like this: 
mapped = from m in mapped 
      join r in reasons on m.Id equals r.Id 
      update m.Reason = r.Reason 
      select m; 

स्पष्ट रूप से उपर्युक्त कोड संकलित नहीं होता है, लेकिन क्या कोई कोड है जिसे मैं लिख सकता हूं जो मैं चाहता हूं?

उत्तर

21

लूप में उत्परिवर्तन करें। सबसे अच्छा, लिंक को इसके द्वारा संचालित संग्रह (संग्रहों) में उत्परिवर्तन से मुक्त होना चाहिए। फ़िल्टर करने, ऑर्डर करने, अपने डेटा को प्रोजेक्ट करने के लिए लिंक का उपयोग करें, संशोधित करने के लिए पारंपरिक तकनीकों का उपयोग करें।

var joinedData = from m in mapped 
       join r in reasons on m.Id equals r.Id 
       select new { m, r }; 

foreach (var item in joinedData) 
{ 
    item.m.Reason = item.r.Reason; 
} 
+0

धन्यवाद। मुझे लगता है कि प्रदर्शन के अनुसार यह एक बड़ी हिट नहीं है क्योंकि मैं मानचित्र से पहले डेटा पेजिंग कर रहा हूं, इसलिए दूसरी बार फिर से चलना कोई समस्या नहीं होगी। – Dismissile

+0

यदि आप मापते हैं और पाते हैं कि यह एक प्रदर्शन बाधा है, तो वापस आएं और इसे संबोधित करें, अगर हम * के पास * उत्परिवर्तन कर सकते हैं। हालांकि, मैं तब तक ऐसा नहीं करूँगा जब तक कि मुझे पता न हो कि यह मुझे धीमा कर रहा है। –

+0

मैं एक समय में लगभग 10 आइटम पेज करता हूं। मुझे अत्यधिक संदेह है कि यह किसी भी प्रदर्शन के मुद्दों का कारण बन जाएगा :) – Dismissile

0

एक जानवर बल तरीका होगा: -

foreach(var m in mapped) 
{ 
    m.Reason = reasons.Single(r=> r.Id == m.Id).Reason; 
} 

वास्तव में, इस कार्यान्वयन काफी अपने छद्म कोड के करीब है।

5

यह आपका बहुत समय बचा सकता है। कोड के नीचे दो संग्रहों में शामिल होने और पहले संग्रह के संपत्ति मूल्य को सेट करने के लिए है।

class SourceType 
{ 
    public int Id; 
    public string Name; 
    public int Age { get; set; } 
    // other properties 
} 

class DestinationType 
{ 
    public int Id; 
    public string Name; 
    public int Age { get; set; } 
    // other properties 
} 
    List<SourceType> sourceList = new List<SourceType>(); 
    sourceList.Add(new SourceType { Id = 1, Name = "1111", Age = 35}); 
    sourceList.Add(new SourceType { Id = 2, Name = "2222", Age = 26}); 
    sourceList.Add(new SourceType { Id = 3, Name = "3333", Age = 43}); 
    sourceList.Add(new SourceType { Id = 5, Name = "5555", Age = 37}); 

    List<DestinationType> destinationList = new List<DestinationType>(); 
    destinationList.Add(new DestinationType { Id = 1, Name = null }); 
    destinationList.Add(new DestinationType { Id = 2, Name = null }); 
    destinationList.Add(new DestinationType { Id = 3, Name = null }); 
    destinationList.Add(new DestinationType { Id = 4, Name = null }); 


    var mapped= destinationList.Join(sourceList, d => d.Id, s => s.Id, (d, s) => 
    { 
     d.Name = s.Name; 
     d.Age = s.Age; 
     return d; 
    }).ToList(); 
+1

आपको समझाया जाना चाहिए कि यह क्या कर रहा है। –