Linq Query continua a lanciare "Impossibile creare un valore costante di tipo System.Object ...", Perché?


94

Il seguente è il codice di esempio:

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();
        }
    }

non riesco a capire cosa sto facendo di sbagliato. Continuo a ricevere "Impossibile creare un valore costante di tipo" System.Object ". In questo contesto sono supportati solo i tipi primitivi (" come Int32, String e Guid ")."

Risposte:


232

Usa == invece di uguale a:

where t.CustID == custIdToQuery

Se i tipi non sono corretti potresti scoprire che questo non viene compilato.


10
Puoi spiegare la differenza tra "t.CustID == custIdToQuery" e "t.CustID.Equals (custIdToQuery)". grazie in anticipo
Neel

2
@Neel Dai un'occhiata a questa domanda per una spiegazione sulla differenza tra ==e .Equals(): stackoverflow.com/questions/814878/…
Alex

La logica della soluzione 2011 ha funzionato nel 2018! Awesome Worthful!
Yeshwant Mudholkar

29

Ho avuto lo stesso problema con un int nullable. Usare == invece funziona bene, ma se vuoi usare .Equals, puoi confrontarlo con il valore della variabile nullable, quindi

where t.CustID.Value.Equals(custIdToQuery)

9

Ho avuto lo stesso problema quando stavo cercando di fare .Equals con un decimale nullable. Usare == invece funziona bene. Immagino sia perché non sta cercando di abbinare il "tipo" esatto di decimale? in decimale.


4
Tieni presente che questo è nel contesto di un IQueryable, quindi non è compilato nel normale codice C #. Diventa un'espressione che viene passata a un provider di query. Quel provider di query può fare tutto ciò che vuole con la query e può gestire Equalse ==lo stesso oppure no.
Servizio

Ho usato .Equal()per confrontare Int32?con Int32. Dal momento che Int32?dovrebbe contenere Int32e null, ho pensato che avrebbe funzionato. Ma non è stato così. ==lavorato.
matrice

1

Ho riscontrato lo stesso problema e stavo confrontando l'oggetto della raccolta "User"con il tipo di dati intero "userid"( x.User.Equals(userid))

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

e la query corretta è x.UserId.Equals(userid)

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

Questo è un problema diverso, stai confrontando mele e arance.
Lasse V. Karlsen

com'è diverso. mentre ho affrontato lo stesso problema. Inserisco questa risposta solo come riferimento per gli altri.
Sonker Satish Kumar

0

Nel mio caso, ho cambiato la chiamata diretta di (sender as Button).Textin chiamata indiretta utilizzando una temp var, ha funzionato. codice di lavoro:

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);
    }

codice buggy:

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);
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.