2008-12-18 7 views
6

का उपयोग करते समय समस्याएं मुझे एक एनक प्रकार पर चलने पर LINQ क्वेरी पर ऑर्डरबी एक्सटेंशन विधि का उपयोग करने में कुछ समस्याएं आ रही हैं। मैंने डिज़ाइनर पर सबकुछ खींचकर और छोड़कर दृश्य स्टूडियो का उपयोग करके नियमित डेटाकॉन्टेक्स्ट बनाया है। मैंने तब अलग इकाई मॉडल बनाए हैं, जो कि बस पीओसीओ हैं, और मैंने अपने डेटाबेस से डेटा लाने के लिए एक रिपोजिटरी पैटर्न का उपयोग किया है और उन्हें अपने स्वयं के इकाई मॉडल में मैप किया है (या बल्कि, मेरे पास एक रिपोजिटरी पैटर्न है, जो बनाता है और IQueryable यह सब कुछ करेगा)।लिंक टू एसक्यूएल ऑर्डरबी, एनम्स

सबकुछ ठीक काम करता है, सिवाय जब मैं एक ऐसी संपत्ति पर ऑर्डरबी (भंडार के बाहर) को लागू करने का प्रयास करता हूं जिसे मैंने लघु/छोटे से एनम तक मैप किया है।

public class Campaign 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
    .... 
    public CampaignStatus Status { get; set; } 
    ... 
} 
public enum CampaignStatus : short { 
    Active, 
    Inactive, 
    Todo, 
    Hidden 
} 
public class SqlCampaignRepository : ICampaignRepository 
{ 
... 
    public IQueryable<Campaign> Campaigns() 
    { 
     DataContext db = new DataContext(); 
     return from c in db.Campaigns 
       select new Campaign 
        { 
         Id = c.Id, 
         Name = c.Name, 
         ... 
         Status = (CampaignStatus)c.Status, 
         ... 
        }; 
    } 
} 

और फिर कहीं और

SqlCampaignRepository rep = new SqlCampaignRepository(); 
var query = rep.Campaigns().OrderBy(c => c.Status); 

यह निम्नलिखित अपवाद चलाता है:

यहाँ प्रासंगिक कोड बिट्स हैं System.ArgumentException उपयोगकर्ता कोड से बिना क्रिया था संदेश = "तर्क ' मूल्य 'गलत प्रकार था। अपेक्षित' IQMedia.Models.CampaignType '। वास्तविक' System.Int16 '। " स्रोत = "System.Data.Linq" StackTrace: वेद System.Data.Linq.SqlClient.SqlOrderExpression.set_Expression (SqlExpression मूल्य) वेद System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect (चयन SqlSelect) वेद System.Data.Linq.SqlClient.SqlVisitor.Visit (SqlNode नोड) वेद System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScope (SqlIncludeScope गुंजाइश) ...

(वहाँ में डेनिश बारे में खेद , ved = द्वारा/पर)।

मैंने ऑर्डर में कम करने के लिए स्थिति को टाइपकास्टिंग करने का प्रयास किया है, लेकिन यह मदद नहीं करता है, अगर मैं इसे वास्तविक enum प्रकार में भी डालता हूं।

इस पर फ़िक्सिंग करने में कोई भी सहायता बहुत सराहना की जाती है!

उत्तर

3

क्या आप CampaignStatus टाइप कर सकते हैं सीधे DataContext डिज़ाइनर को कम करें? इस प्रकार मान स्वचालित रूप से enum पर मैप किया जाता है।

1

Campaign कक्षा और Campaigns के बीच संबंध क्या है? यदि CampaignsCampaign ऑब्जेक्ट का सेट देता है, तो ध्यान दें कि आप आमतौर पर select new मैप किए गए इकाई नहीं कर सकते हैं।

मुझे आश्चर्य है कि अगर आप चयन से पहले ऑर्डरबी करते हैं तो यह बेहतर होगा?

एक अंतिम चाल एक नकली composable [Function] बनाने के लिए, छोटे TSQL का उपयोग कर हो सकता है। उदाहरण के लिए, ABS पर्याप्त हो सकता है। की तरह यानी कुछ (संदर्भ पर):

[Function(Name="ABS", IsComposable=true)] 
    public int Abs(int value) 
    { // to prove not used by our C# code... 
     throw new NotImplementedException(); 
    } 

फिर प्रयास करें:

.OrderBy(x => ctx.Abs(x.Status)) 

मैं ऊपर का परीक्षण नहीं किया है, लेकिन यह एक बाद की जाने दे सकते हैं ... यह किसी अन्य समान के लिए काम करता मामलों, हालांकि। एक शॉट

वर्थ ...

0

मेरे DataContext यह ही इकाई वर्ग नामित अभियान, (बेशक, एक अलग नाम स्थान में रहने वाले) है है। इसके अलावा स्थिति कॉलम डेटाबेस में एक छोटे से के रूप में सहेजा जाता है, और LINQ इकाई नामस्थान में यह छोटा प्रकार (System.Int16) के रूप में सूचीबद्ध है।

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

मैं भी जोड़ना भूल गया - अपवाद स्पष्ट रूप से तब तक नहीं होता जब तक कि मैं क्वेरी निष्पादित करने की कोशिश नहीं करता (यानी - कॉल करने के लिए कॉललिस्ट, या संग्रह पर गणना)।

बड़ी तस्वीर में इस विधि का उपयोग एक सेवा वर्ग द्वारा किया जा रहा है जिसे तब फ़िल्टरिंग, सॉर्टिंग और वह सब जोड़ना चाहिए - और यह सब कुछ निश्चित रूप से चीज़ों को अलग करने के लिए है, लेकिन यह भी अनुमति देने के लिए किसी भिन्न डेटाबेस में आसान संक्रमण, या एक अलग OR/M, बाद में, यदि वह इच्छा होगी।

आह ने आखिरी बिट को तब तक नहीं देखा जब तक मैंने जवाब नहीं दिया - मुझे फ़ंक्शन विशेषता का उपयोग करके कोई अनुभव नहीं मिला है, लेकिन मुझे कक्षा में डेटाकॉन्टेक्स्ट तक पहुंच नहीं होगी, जहां मुझे सॉर्टिंग लागू करना है।