2009-12-20 16 views
5

मेरे पास एसक्यूएल विधि के लिए कुछ linq है और जब यह क्वेरी करता है तो यह कुछ अनाम प्रकार देता है।सी # में एक सामान्य सूची संग्रह कैसे वापस करें?

मैं उस अज्ञात प्रकार को अपनी सेवा परत पर वापस लौटना चाहता हूं ताकि कुछ तर्क और सामान हो सके।

मुझे नहीं पता कि इसे कैसे वापस किया जाए।

मैंने सोचा कि मैं इस

public List<T> thisIsAtest() 
{ 
    return query; 
} 

कर सकता है, लेकिन मैं इस त्रुटि मिलती है

Error 1 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

तो यकीन नहीं क्या विधानसभा मुझे याद आ रही है या कि अगर भी मामला है।

धन्यवाद

संपादित

ठीक है मेरी पहली समस्या हल हो गया था, लेकिन अब मैं एक नई समस्या यह है कि मुझे यकीन है कि के बाद से मैं गुमनाम प्रकार के बारे में ज्यादा पता नहीं है तय करने के लिए कैसे नहीं कर रहा हूँ है।

मैं इस त्रुटि मिलती है

परोक्ष प्रकार कनवर्ट नहीं कर सकता 'System.Collections.Generic.List' 'System.Collections.Generic.List को

क्वेरी

है
DbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0) 
     .GroupBy(u => new { u.Table.Prefix }) 
     .Select(group => new { prefix = group.Key, 
           Marks = group.Sum(item => (item.Mark * item.Weight)/item.OutOFF) }) 
     .ToList(); 

संपादित करें 2

012 अवधि -
public class ReturnValue 
{ 
    string prefix { get; set; } 
    decimal? Marks { get; set; } 
} 

public List<ReturnValue> MyTest(Guid userId) 
{ 
    try 
    { 
     var result = dbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0).GroupBy(u => new { u.Table.Prefix }) 
     .Select(group => new { prefix = group.Key, Marks = group.Sum(item => (item.Mark * item.Weight)/item.OutOFF) }).ToList(); 
     return result; 
    } 
    catch (SqlException) 
    { 
     throw; 
    } 

का चयन इस यह

Anonymous Types: 

a is new{string Prefix} 
b is new{ 'a prefix, decimal? marks} 
+0

आप एक नए प्रकार के 'क्लास रिटर्नवैल्यू {int उपसर्ग को परिभाषित क्यों नहीं कर सकते; दशमलव अंक; } 'और फिर एक अज्ञात प्रकार के बजाय' नया रिटर्न वैल्यू (....) 'वापस करें ?? –

+0

मुझे एक उदाहरण की आवश्यकता होगी। मुझे यह प्रश्न बनाने में मदद मिली जो मैं चाहता हूं लेकिन अगर इसे बदला जा सकता है या इसे अज्ञात बनाने के लिए कुछ जोड़ा गया है, तो मैं इसके लिए सब कुछ कर रहा हूं। – chobo2

+0

आप मेरे द्वारा उल्लिखित कोड का उपयोग नहीं कर रहे हैं! 'चयन करें()' में, आपको उपयोग करने की आवश्यकता है: 'चयन करें (समूह => नया RETURNVALUE {prefix = group.Key, ... '- यह * नहीं * आपके पास क्या है! आपने नहीं जोड़ा ** टाइप ** ** में बनाया जा रहा है। चयन करें() - यह आपकी समस्या है –

उत्तर

8

आप नहीं कर सकते में है। आप अपने स्वयं के दायरे से बाहर अज्ञात प्रकारों का उपयोग नहीं कर सकते हैं, उदा। आप उन्हें एक विधि से वापसी मूल्य के रूप में वापस नहीं कर सकते हैं।

यदि आपको उन्हें वापस करने की आवश्यकता है, तो आपको अनाम प्रकार के बजाय एक नई ठोस कक्षा को परिभाषित करने की आवश्यकता है, और अनाम प्रकार के स्थान पर इसका उपयोग करें।

देखें रिक Strahl के blog post गुमनाम प्रकार के scoping पर, और देखो MSDN docs here जो स्पष्ट रूप से राज्य:

एक अनाम प्रकार विधि गुंजाइश है। किसी अज्ञात प्रकार को पास करें, या संग्रह जिसमें अज्ञात प्रकार हैं, विधि सीमा के बाहर, आप को पहले ऑब्जेक्ट को ऑब्जेक्ट डालना होगा। हालांकि, यह गुमनाम प्रकार के मजबूत टाइपिंग को हरा देता है।यदि आप को अपने क्वेरी परिणामों को संग्रहीत करना चाहते हैं या उन्हें विधि सीमा के बाहर किसी अज्ञात प्रकार के संरचना या कक्षा का उपयोग करने पर विचार करें।

ठीक है, निश्चित रूप से - अज्ञात प्रकारों को वास्तव में वापस करने के लिए गंदे भयानक हैक्स हैं। लेकिन अगर माइक्रोसॉफ्ट के एमएसडीएन और जॉन स्कीट उस अभ्यास को हतोत्साहित करते हैं, तो - बस इसे न करें। परिभाषा और इरादा करके, गुमनाम प्रकार chobo2 के लिए विधि वे में परिभाषित कर रहे हैं करने के लिए बाध्य कर रहे हैं

अद्यतन:। मैं नहीं जानता कि क्या आपके datatypes हैं - बस अनुमान लगा - लेकिन यह सोचते हैं "उपसर्ग" एक पूर्णांक है और "निशान" एक दशमलव है, आप एक नया वर्ग को परिभाषित कर सकते हैं:

public class ReturnValue 
{ 
    int prefix { get; set; } 
    decimal Marks { get; set; } 
} 

और फिर अपना कोड एक विधि है कि रिटर्न होगा एक List<ReturnValue>:

public List<ReturnValue> thisIsAtest() 
{ 
    DbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0) 
    .GroupBy(u => new { u.Table.Prefix }) 
    .Select(group => new ReturnValue 
          { prefix = group.Key, 
          Marks = group 
           .Sum(item => (item.Mark * item.Weight)/item.OutOFF) }) 
    .ToList(); 
} 

यहाँ मुख्य बिंदु: अपनेमें 0 विधि, बजाय एक गुमनाम प्रकार का एक नया उदाहरण बनाने की:

 .Select(group => new { prefix = group.Key, marks = .... } 

आप एक ठोस प्रकार का एक उदाहरण बनाने के लिए:

 .Select(group => new ReturnValue { prefix = group.Key, marks = .... } 

इस तरह, आप एक ठोस वर्ग ReturnValue होगा - जो कुछ भी आपको पसंद है - और फिर आप उस प्रकार की सूची आसानी से वापस कर सकते हैं, और उस प्रकार का कहीं और भी उपयोग कर सकते हैं।

+0

दरअसल, आप यह कर सकते हैं: http://msmvps.com/blogs/jon_skeet/archive/2009/01/09/horrible-grotty-hack-returning-an-anonymous-type-instance.aspx यह नहीं कि मैं इसकी अनुशंसा करता हूं हालांकि। –

+0

हम्म मैं एक उदाहरण देख सकता हूँ। मुझे यह मिल गया मैं अपनी रिपोजिटरी परत में तर्क नहीं करना चाहता हूं अन्यथा मुझे उसी विधि के 2 बनाना है क्योंकि मैं इसे स्थान पर उपयोग करता हूं लेकिन डेटा को 2 अलग-अलग तरीकों से उपयोग करने की आवश्यकता है। परोक्ष 'System.Collections.Generic.List chobo2

+0

@MarkByers में बदल सकते हैं नहीं प्रकार' System.Collections.Generic.List ': लेकिन जॉन खुद कहते हैं: "इस कोड का उपयोग नहीं है" .. .... वास्तव में, सभी उद्देश्यों और उद्देश्यों के लिए: ** नहीं ** ** - कोशिश भी मत करो। –

6
public List<T> thisIsAtest<T>() 
{ 
    return query; 
} 
+0

जिसने उस समस्या को हल किया लेकिन अब मुझे यह स्पष्ट रूप से प्रकार 'System.Collections.Generic.List ' सिस्टम में परिवर्तित नहीं कर सकता .Collections.Generic.List chobo2

+1

जो क्वेरी आप लौट रहे हैं वह अनाम प्रकारों की एक सूची है, आप केवल की एक सूची लौट सकते हैं। आप ऑब्जेक्ट्स का उपयोग कर सकते हैं और जॉन स्कीट द्वारा हैक कास्टिंग कर सकते हैं, लेकिन इसकी दृढ़ता से अनुशंसा नहीं की जाती है। –

2

आप एक नियमित विधि से एक अनाम प्रकार वापस करना चाहते हैं? मुझे पूरा यकीन है कि आप प्रतिबिंब के साथ कर सकते हैं, लेकिन कोई भी प्रकार की सुरक्षा और अन्य समस्याओं की पूरी मेजबानी नहीं होगी। उल्लेख नहीं है कि यह कॉलिंग कोड परिप्रेक्ष्य से अजीब लग रहा है। आपको मूल रूप से मुझे लगता है कि ऑब्जेक्ट वापस करना होगा।

आप कक्षा या संरचना का बेहतर उपयोग करेंगे और वहां मूल्यों को सामान देंगे।

0

बेनामी प्रकार बहुत सीमित हैं, आप केवल विधि के दायरे में उनका उपयोग कर सकते हैं उन्हें घोषित किया गया था।

आप उन्हें सादे ऑब्जेक्ट्स के रूप में वापस भेज सकते हैं, लेकिन फिर आप प्रकार की जानकारी खो देते हैं। मैंने कुछ अज्ञात प्रकारों को पास करने के कुछ समाधान देखे हैं; लेकिन वे बाद के बिंदु पर गुणों को पुनः प्राप्त करने के लिए प्रतिबिंब का उपयोग करते हैं।

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