6

मैं इसे और अधिक पोस्ट कर रहा हूं क्योंकि मैं और जानना चाहता हूं, क्योंकि मेरा काम-आसपास मूल रूप से LINQ से इकाइयों का उपयोग करने से बचने के लिए किया गया है! यह अच्छा होगा अगर मैं इसका उपयोग कर सकता हूं। तो अगर कोई मुझे प्रबुद्ध कर सकता है ..LINQ से Entities ToString() - प्रस्तावित समाधानों में से कोई भी काम नहीं करता है?

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

मैंने here पर मिली जानकारी के आधार पर व्यूबैग में श्रेणियों का एक आईनेमेरेबल संग्रह लौटकर शुरू किया। यह चीजों से संपर्क करने के लिए वास्तव में एक अच्छा तरीका लग रहा था।

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

public class ProductModel 
{ 
    public int Id { get; set; } 
    public int CategoryId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public double Price { get; set; } 
    public bool IsVisible { get; set; } 

    public IEnumerable<SelectListItem> Categories 
    { 
     get 
     { 
      return new DataAccess() 
       .Categories 
       .OrderBy(c => c.Description) 
       .Select(c => new SelectListItem 
        { 
         Value = c.Id.ToString(), 
         Text = c.Description 
        }); 
     } 
    } 
} 

यह निम्न त्रुटि संदेश में परिणाम है: "संस्थाओं को LINQ विधि 'System.String ToString()' विधि की पहचान नहीं करता है और इस विधि एक दुकान अभिव्यक्ति में अनुवाद नहीं किया जा सकता है।"। एक प्रस्तावित ऑनलाइन समाधान इकाई फ्रेमवर्क द्वारा प्रदान की गई SQL कार्यक्षमता विधियों का उपयोग करना था। तो मैंने कोशिश की यह बजाय ...

public IEnumerable<SelectListItem> Categories 
    { 
     get 
     { 
      return new DataAccess() 
       .Categories 
       .OrderBy(c => c.Description) 
       .Select(c => new SelectListItem 
        { 
         Value = SqlFunctions.StringConvert((double)c.Id), 
         Text = c.Description 
        }); 
     } 
    } 

लेकिन यह इस त्रुटि संदेश में परिणाम है: 'System.String StringConvert (System.Nullable`1 [System.Double])' प्रकार पर "निर्दिष्ट विधि ' System.Data.Objects.SqlClient.SqlFunctions 'को LINQ से Entities store अभिव्यक्ति में अनुवादित नहीं किया जा सकता है। "।

मैंने आईडीएएसस्ट्रिंग नामक डेटा क्लास में केवल पढ़ने योग्य संपत्ति जोड़ने का प्रयास किया है, लेकिन यह स्पष्ट रूप से इकाई फ्रेमवर्क को बहुत दुखी करता है!

अंत में, मुझे एहसास हुआ कि यह हर समय लायक नहीं था जब मैं इसमें डाल रहा था, और बस LINQ का उपयोग बंद कर दिया। यह ठीक काम करता है, लेकिन यह जानना अच्छा होगा कि ऐसा करने के लिए "सही" तरीका है जो वास्तव में काम करता है!

यह मेरा वर्तमान कार्यशील समाधान है:

public IEnumerable<SelectListItem> Categories 
    { 
     get 
     { 
      var dal = new DataAccess(); 
      var categories = dal.Categories; 
      var items = new List<SelectListItem>(); 

      foreach (var category in categories) 
       items.Add(new SelectListItem 
        { 
         Value = category.Id.ToString(), 
         Text = category.Description 
        }); 

      return items; 
     } 
    } 

तो अगर किसी को पहले से ही इस कर रहा है और उन्हें लगता है कि वे इसे "सही" जिस तरह से कर रहे हैं, तो मुझे पता है कि आप क्या करना चाहते हैं!

उत्तर

11

आपके द्वारा ToString को आमंत्रित करने से पहले क्वेरी को मटेरियल करें, अंतिम भाग को एक गैर linq-to-entities क्वेरी बना देगा। आप केवल आईडी और विवरण का चयन करके इसे अनुकूलित कर सकते हैं, फिर AsEnumerable को कॉल कर सकते हैं, और फिर selectlistitems प्राप्त कर सकते हैं।

return new DataAccess() 
     .Categories 
     .OrderBy(c => c.Description) 
     .AsEnumerable() 
     .Select(c => new SelectListItem 
      { 
       Value = c.Id.ToString(), 
       Text = c.Description 
      }); 
+0

वाह। यह वास्तव में इतना आसान था - धन्यवाद !! मुझे लगा कि यह "सरल" होना चाहिए! –

+3

आप 'ToList' के बजाय' AsEnumerable' का भी उपयोग कर सकते हैं। एक सूची आवंटित जो केवल समझा जाएगा व्यर्थ है। 'AsEnumerable' के साथ आप प्रत्येक आइटम को केवल एक बार गणना करेंगे, जैसा कि 'ToList' के साथ दो बार विरोध किया गया है। यदि आप कुछ नतीजे वापस कर रहे हैं, तो हालांकि कोई समझदार अंतर नहीं होगा। –

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