Linq Query “System.Object…” का निरंतर मान बनाने में असमर्थ होने के कारण फेंकती रहती है, क्यों?


94

निम्नलिखित कोड नमूना है:

private void loadCustomer(int custIdToQuery) 
    {
        var dbContext = new SampleDB();
        try
        {
            var customerContext = from t in dbContext.tblCustomers      // keeps throwing:
                                   where t.CustID.Equals(custIdToQuery) // Unable to create a constant value of type 'System.Object'. 
                                   select new                           // Only primitive types ('such as Int32, String, and Guid') 
                                   {                                    // are supported in this context.
                                       branchId = t.CustomerBranchID,   //
                                       branchName = t.BranchName        //
                                   };                                   //

            if (customerContext.ToList().Count() < 1) //Already Tried customerContext.Any()
            {
                lstbCustomers.DataSource = customerContext;
                lstbCustomers.DisplayMember = "branchName";
                lstbCustomers.ValueMember = "branchId";
            }
            else
            {
                lstbCustomers.Items.Add("There are no branches defined for the selected customer.");
                lstbCustomers.Refresh();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            dbContext.Dispose();
        }
    }

मैं यह समझने में असमर्थ हूँ कि मैं क्या गलत कर रहा हूँ। मुझे "System.Object 'का एक निरंतर मान बनाने में असमर्थता हो रही है। इस संदर्भ में केवल आदिम प्रकार (' जैसे Int32, स्ट्रिंग और गाइड ') का समर्थन किया जाता है।"

जवाबों:


232

बराबरी के बजाय == का उपयोग करें:

where t.CustID == custIdToQuery

यदि प्रकार गलत हैं, तो आप पा सकते हैं कि यह संकलन नहीं करता है।


10
क्या आप कृपया "t.CustID == custIdToQuery" और "t.CustID.Equals (custIdToQuery)" के बीच अंतर बता सकते हैं। अग्रिम धन्यवाद
नील

2
@ नील के बीच अंतर पर स्पष्टीकरण के लिए इस सवाल पर एक नज़र डालें : ==और stackoverflow.com/questions/814878/….Equals()
एलेक्स

2011 समाधान तर्क 2018 के लिए काम किया! बहुत बढ़िया!
यशवंत मुधोलकर

29

मैं एक अशक्त int के साथ एक ही मुद्दा था। == का उपयोग करने के बजाय अच्छी तरह से काम करता है, लेकिन यदि आप उपयोग करना चाहते हैं। तो, आप इसे अशक्त चर के मान से तुलना कर सकते हैं, इसलिए

where t.CustID.Value.Equals(custIdToQuery)

9

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


4
ध्यान रखें कि यह IQueryableए के संदर्भ में है , इसलिए इसे नियमित सी # कोड में संकलित नहीं किया गया है। यह एक अभिव्यक्ति है जो एक क्वेरी प्रदाता को दी जाती है। वह क्वेरी प्रदाता क्वेरी के साथ जो चाहे कर सकता है, और वह संभाल सकता है Equalsऔर ==वही या नहीं।
सर्व

मैं .Equal()तुलना Int32?करता था Int32। चूंकि Int32?इसमें निहित है Int32और null, मुझे लगा कि यह काम करेगा। लेकिन ऐसा नहीं हुआ। ==काम किया।
मैट्रिक्स

1

मुझे एक ही समस्या का सामना करना पड़ा और मैं "User"पूर्णांक डेटा प्रकार के साथ संग्रह ऑब्जेक्ट की तुलना कर रहा था "userid"( x.User.Equals(userid))

from user in myshop.UserPermissions.Where(x => x.IsDeleted == false && x.User.Equals(userid))

और सही प्रश्न है x.UserId.Equals(userid)

from user in myshop.UserPermissions.Where(x => x.IsDeleted == false && x.UserId.Equals(userid))

यह एक अलग समस्या है, आप सेब और संतरे की तुलना कर रहे हैं।
लास वी। कार्लसन

यह कैसे अलग है। जबकि मैंने एक ही मुद्दे का सामना किया है। मैं केवल दूसरों के लिए संदर्भ के लिए इस उत्तर को पोस्ट करता हूं।
सतीश कुमार सोनकर

0

मेरे मामले में, मैंने (sender as Button).Textएक अस्थायी संस्करण का उपयोग करके अप्रत्यक्ष कॉल के प्रत्यक्ष कॉल को बदल दिया है , काम किया है। काम कोड:

private void onTopAccBtnClick(object sender, EventArgs e)
    {
        var name = (sender as Button).Text;
        accountBindingSource.Position =
                    accountBindingSource.IndexOf(_dataService.Db.Accounts.First(ac => ac.AccountName == name));
        accountBindingSource_CurrentChanged(sender, e);
    }

छोटी गाड़ी कोड:

private void onTopAccBtnClick(object sender, EventArgs e)
    {
        accountBindingSource.Position =
                    accountBindingSource.IndexOf(_dataService.Db.Accounts.First(ac => ac.AccountName == (sender as Button).Text));
        accountBindingSource_CurrentChanged(sender, e);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.