2013-02-18 52 views
9

शायद कुछ लौटने के लिए, लेकिन मैं सिर्फ यह नहीं देख सकते हैं ...समान (?) C# और VB.NET LINQ प्रश्नों अलग परिणाम वास्तव में आसान

मैं LINQ में एक एमएस एक्सेस क्वेरी नकल कर रहा हूँ। मैंने इसे परीक्षण करने के लिए पहले सी # में लिखा था, क्योंकि मैं सी # पसंद करता हूं, फिर मैंने इसे वीबी.Net वाक्यविन्यास में अनुवादित किया। जहां तक ​​मैं दो प्रश्नों को बता सकता हूं, समान है, लेकिन सी # क्वेरी सही परिणाम देता है, VB.NET एक शून्य परिणाम देता है।

क्या कोई देख सकता है कि अंतर कहां हो सकता है?

सी # क्वेरी:

var table1 = dc.MainTable.Where(o => o.Year == 423).ToList().Select(o => new 
{ 
    Key_ID = o.Key_ID.Value, 
    CropID = o.CropID.Value, 
    GroupID = o.GroupID.Value, 
    Surface1 = o.Surface1.Value, 
    Surface2 = o.Surface2.Value 
}); 

var table2 = dc.OtherTable.Where(o => o.Year == 423).ToList().Select(o => new 
{ 
    Key_ID = o.Key_ID.Value, 
    CropID = int.Parse(o.SAKU_CD), 
    GroupID = int.Parse(o.SAN_DAN_NO), 
    Surface1 = Convert.ToDouble(o.KEIHAN_MEN.Value), 
    Surface2 = Convert.ToDouble(o.SAKU_MEN.Value) 
}); 

var output = table1.Join(table2, t1 => new 
{ 
    t1.Key_ID, 
    t1.CropID, 
    t1.GroupID, 
    t1.Surface1, 
    t1.Surface2 
}, 
t2 => new 
{ 
    t2.Key_ID, 
    t2.CropID, 
    t2.GroupID, 
    t2.Surface1, 
    t2.Surface2 
}, (t1, t2) => new OutputDataType() 
{ 
    Key_ID = t1.Key_ID, 
    Year = 423 
}).ToList(); 

VB.NET क्वेरी:

Dim table1 = MainTable.Where(Function(o) o.Year.Value = 423).ToList().Select(Function(o) New With 
{ 
    .Key_ID = o.Key_ID.Value, 
    .CropID = o.CropID.Value, 
    .GroupID = o.GroupID.Value, 
    .Surface1 = o.Surface1.Value, 
    .Surface2 = o.Surface2.Value 
}).ToList() 

Dim table2 = OtherTable.Where(Function(o) o.Year.Value = 423).ToList().Select(Function(o) New With 
{ 
    .Key_ID = o.Key_ID.Value, 
    .CropID = Convert.ToInt32(o.SAKU_CD), 
    .GroupID = Convert.ToInt32(o.SAN_DAN_NO), 
    .Surface1 = Convert.ToDouble(o.KEIHAN_MEN.Value), 
    .Surface2 = Convert.ToDouble(o.SAKU_MEN.Value) 
}).ToList() 

Dim output = table1.Join(table2, Function(t1) New With 
{ 
    t1.Key_ID, 
    t1.CropID, 
    t1.GroupID, 
    t1.Surface1, 
    t1.Surface2 
}, Function(t2) New With 
{ 
    t2.Key_ID, 
    t2.CropID, 
    t2.GroupID, 
    t2.Surface1, 
    t2.Surface2 
}, Function(t1, t2) New OutputDataType With {.Key_ID = t1.Key_ID, .Year = 423}).ToList() 

दोनों सी # और VB.Net table1 और table2 में ही कर रहे हैं, तो यह Join जो विफल रहता है होना चाहिए ।

संपादित

मैं सिर्फ Join VB.Net में वाक्य रचना क्वेरी करने के लिए, इस तरह बदल दिया है:

Dim output = From t1 In MainTable 
       Join t2 In OtherTable 
       On t1.Key_ID Equals t2.Key_ID And t1.GroupID Equals t2.GroupID And t1.CropID Equals t2.CropID And t1.Surface1 Equals t2.Surface1 And t1.Surface2 Equals t2.Surface2 
       Select New OutputDataTypeData With {.Key_ID = t1.Key_ID, .Year = 423} 

कौन सा सही परिणाम देता है। लेकिन मुझे वास्तव में यह नहीं पता कि यह विस्तार विधि Join वाक्यविन्यास से अलग कैसे है?

उत्तर

10

आप Join विस्तार विधि का उपयोग करते हैं, तो कुंजी के रूप में आप outerKeySelector और innerKeySelector तर्क Equals पद्धति का उपयोग करके तुलना की जाती है प्रदान करते हैं।

लेकिन सी # और VB.Net गुमनाम प्रकार अलग ढंग से यहाँ संभाल:

सी #

var a = new {Foo = 1, Bar = 2 }; 
var b = new {Foo = 1, Bar = 2 }; 
bool result = a.Equals(b); // true 

VB.Net

Dim a = new with {.Foo = 1, .Bar = 2} 
Dim b = new with {.Foo = 1, .Bar = 2} 
Dim result = a.Equals(b) ' False ' 

यहाँ क्या हो रहा है?

सी # गुणों के मूल्यों की तुलना में दो वस्तुओं की तुलना करने के लिए मूल्य समानता का उपयोग करता है।

वीबी.Net दो वस्तुओं की तुलना करने के लिए संदर्भ समानता का उपयोग करता है, इसलिए परिणाम False है।

अपने कोड काम करवाने के लिए, आप स्पष्ट रूप से बताने के लिए VB.Net Key कीवर्ड का उपयोग गुण तुलना करने के लिए है:

कुंजी गुण कई मौलिक तरीकों से गैर-प्रमुख गुण से अलग:

  • यह निर्धारित करने के लिए कि दो उदाहरण बराबर हैं या नहीं, केवल प्रमुख गुणों के मानों की तुलना की जाती है।
  • प्रमुख गुणों के मान केवल पढ़ने के लिए हैं और इन्हें बदला नहीं जा सकता है।
  • एक अज्ञात प्रकार के लिए संकलक द्वारा जेनरेट किए गए हैश कोड एल्गोरिदम में केवल प्रमुख संपत्ति मान शामिल हैं।
Dim a = new with {Key .Foo = 1, Key .Bar = 2} 
Dim b = new with {Key .Foo = 1, Key .Bar = 2} 
Dim result = a.Equals(b) # True 

क्वेरी सिंटैक्स काम करता है क्योंकि इस मामले में आप की तुलना नहीं कर रहे हैं अनाम प्रकार/वस्तुओं लेकिन बस int और double रों।

+2

धन्यवाद !! मैं पहले से ही 'कुंजी' कीवर्ड द्वारा पकड़ा गया है। मुझे लगता है कि मैं आपके स्पष्टीकरण को प्रिंट कर रहा हूं और इसे अपने पीसी पर स्टिकर कर रहा हूं, इसलिए मैं अब और इसके बारे में नहीं भूलता। बहुत बहुत धन्यवाद! –