96 votes

Linq Query continue à lancer "Impossible de créer une valeur constante de type System.Object ....", Pourquoi?

Voici l'exemple de code:

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

Je suis incapable de comprendre ce que je fais mal. Je continue à obtenir "Impossible de créer une valeur constante de type 'System.Object'. Seuls les types primitifs (" tels que Int32, String et Guid ") sont pris en charge dans ce contexte."

238voto

Mark Byers Points 318575

Utilisez == au lieu de égal:

 where t.CustID == custIdToQuery
 

Si les types sont incorrects, vous constaterez peut-être que cela ne compile pas.

29voto

kloarubeek Points 548

J'ai eu le même problème avec un int nullable. Utiliser == à la place fonctionne bien, mais si vous voulez utiliser .Equals, vous pouvez le comparer à la valeur de la variable nullable, donc

 where t.CustID.Value.Equals(custIdToQuery)
 

9voto

Dave Stuart Points 82

J'ai eu le même problème lorsque j'essayais de faire .Equals avec un nombre décimal nullable. Utiliser == au lieu de cela fonctionne bien. Je suppose que c’est parce qu’il n’essaie pas de faire correspondre le "type" exact de décimal? décimal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X