2012-05-24 11 views
11

के साथ splitOn के साथ काम नहीं करता है मुझे NULL वाले कॉलम पर विभाजित करने की कोशिश करने वाले डैपर में मल्टीमैप्स के साथ कोई समस्या है। डैपर ऑब्जेक्ट को तुरंत चालू नहीं करता है और मेरे मैपिंग फ़ंक्शन को ऑब्जेक्ट के बजाय null प्राप्त होता है।डैपर मल्टीमैप नल मूल्य

यह मेरा नया परीक्षण है:

class Product 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public Category Category { get; set; } 
    } 
    class Category 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
    } 
    public void TestMultiMapWithSplitWithNullValue() 
    { 
     var sql = @"select 1 as id, 'abc' as name, NULL as description, 'def' as name"; 
     var product = connection.Query<Product, Category, Product>(sql, (prod, cat) => 
     { 
      prod.Category = cat; 
      return prod; 
     }, splitOn: "description").First(); 
     // assertions 
     product.Id.IsEqualTo(1); 
     product.Name.IsEqualTo("abc"); 
     product.Category.IsNotNull(); 
     product.Category.Id.IsEqualTo(0); 
     product.Category.Name.IsEqualTo("def"); 
     product.Category.Description.IsNull(); 
    } 

लाइन है कि विफल रहता है तथ्य यह है कि cat मानचित्रण कार्य करने के लिए पारित कर दिया null है की वजह से product.Category.IsNotNull(); है।

मैं भी वर्ग का दावा करने के लिए इस विधि को जोड़ दिया है:

public static void IsNotNull(this object obj) 
{ 
    if (obj == null) 
    { 
     throw new ApplicationException("Expected not null"); 
    } 
} 
+0

मुझे ट्विटर पर ट्विटर को पिंग करने में मदद करना अच्छा लगेगा जो खिड़कियों के लिए जिथब लिखते हैं। मुझे पता है कि वे इस लाइन को समाप्त करने वाली समस्या को खोजने के लिए कड़ी मेहनत कर रहे हैं –

+0

@ सैमसाफ्रॉन - आपकी टिप्पणी के लिए धन्यवाद। अगर आप इसे हल करने के बाद मुझे बताते हैं, तो मैं अपने परिवर्तनों को धक्का दे सकता हूं। आप मेरी पोस्ट से परीक्षण की प्रतिलिपि बना सकते हैं, हालांकि - यह स्पष्ट है कि परिवर्तन कहाँ जाना चाहिए ;-) पीएस। मुझे खिड़कियों के लिए जिथब पसंद है। अगर मुझे परीक्षण के साथ मदद मिलती है तो मुझे बताएं। –

+2

मैंने डैपर के लिए एक पीआर भेजा है जो इन पंक्तियों को समाप्त करने वाली समस्याओं को दूर करना चाहिए।अगर वे अभी भी दिखते हैं तो मुझे बताएं। कहानी का नैतिक: * कॉपी-पेस्ट [यह फ़ाइल] (https://gist.github.com/2802523#file_the+original+guy+used+autocrlffalse) '.gitattributes' के रूप में यदि मूल व्यक्ति' autocrlf = false '* कॉपी-पेस्ट [यह फ़ाइल] (https://gist.github.com/2802523#file_the+original+guy+used+autocrlftrue)' .gitattributes' के रूप में यदि वह 'autocrlf = true' –

उत्तर

14

यह है "द्वारा डिजाइन" हालांकि मैं यह फिर से ठीक हो जाएगा।

विशेष रूप से यह व्यवहार बाएं जुड़ने में सहायता के लिए है। उदाहरण के लिए यह लो:

cnn.Query<Car,Driver>("select * from Cars c left join Drivers on c.Id = CarId", 
    (c,d) => {c.Driver = d; return c;}) 

मुसीबत यह है कि अगर हम एक Driver वस्तु का एक "कंबल" निर्माण की अनुमति, हर Car एक Driver भी हैं जहां में विफल रहा है में शामिल होने जा रहा है।

आसपास काम करने के लिए हम पूरे सेगमेंट को विभाजित कर सकते हैं और यह सुनिश्चित कर सकते हैं कि NULL ऑब्जेक्ट मैप करने से पहले सभी मान NULL हैं। मल्टी मैपर पर इसका बहुत मामूली परफ प्रभाव होगा।

अपने मामले के लिए युक्ति के लिए, आप एक किराए स्तंभ सम्मिलित हो सकते हैं:

var sql = @"select 1 as id, 'abc' as name, '' as split, 
      NULL as description, 'def' as name"; 
    var product = connection.Query<Product, Category, Product>(sql, (prod, cat) => 
    { 
     prod.Category = cat; 
     return prod; 
    }, splitOn: "split").First(); 
+1

उत्तर के लिए धन्यवाद - में तुम्हारी बात समझ रहा हूँ। मैंने 'ड्राइवर्स' तालिका की प्राथमिक कुंजी का उपयोग करके अपने प्रोजेक्ट में समान वर्कअराउंड लागू किया है। खाली सरोगेट कॉलम बल प्रत्येक पंक्ति के लिए सृजन का ऑब्जेक्ट करता है, यहां तक ​​कि जो लोग बाएं शामिल होने में असफल होते हैं, इसलिए लापता रिकॉर्ड खोजने के लिए मुझे मैपिंग फ़ंक्शन में सभी गुणों को स्वयं जांचना होगा। यह बहुत अच्छा होगा अगर डैपर कई मैप्स में 'न्यूल' के लिए कई गुणों की जांच करने के बजाय इसे सामान्य तरीके से संभाल सकता है। शायद कुछ झंडा pefr सुधारने के लिए? एक और वर्णनात्मक उदाहरण (http://code.google.com/p/dapper-dot-net/) का भी स्वागत किया जाएगा। –

+1

मैं बस इस मुद्दे में भाग गया और समय से पहले इस व्यवहार से अवगत नहीं था। इस समस्या से बचने के लिए मुझे कम से कम 'splitOnNull: true' ध्वज रखने में दिलचस्पी होगी। तब तक सरोगेट कॉलम का उपयोग करना होगा। –

+0

क्या यह उदाहरण त्रुटिपूर्ण नहीं है, जिसमें आपके पास "नाम" नामक कॉलम है? –

1

सब जो चाहता है के लिए दृश्य: पिछले बराबर स्तंभ नाम से

डैप्पर विभाजन:

enter image description here

चलो कॉलम का स्थान स्वैप करें:

enter image description here

अशक्त समस्या:

enter image description here

यात स्वॅप केलेले स्तंभ अशक्त:

enter image description here

Spliton बचाव के लिए:

enter image description here

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