Linq Query ciągle wyrzuca „Nie można utworzyć stałej wartości typu System.Object…”, Dlaczego?

94

Poniżej znajduje się przykładowy kod:

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

nie jestem w stanie zrozumieć, co robię źle. Wciąż otrzymuję komunikat „Nie można utworzyć stałej wartości typu„ System.Object ”. W tym kontekście obsługiwane są tylko typy pierwotne (takie jak Int32, String i Guid).”

Neel
źródło

Odpowiedzi:

233

Użyj == zamiast Równa się:

where t.CustID == custIdToQuery

Jeśli typy są nieprawidłowe, może się okazać, że to się nie skompiluje.

Mark Byers
źródło
10
Czy możesz wyjaśnić różnicę między „t.CustID == custIdToQuery” a „t.CustID.Equals (custIdToQuery)”. z góry dzięki
Neel
2
@Neel Spójrz na to pytanie, aby wyjaśnić różnicę między ==i .Equals(): stackoverflow.com/questions/814878/ ...
Alex
Logika rozwiązania 2011 sprawdzała się w 2018! Niesamowite, godne!
Yeshwant Mudholkar
29

Miałem ten sam problem z wartością nullable int. Użycie == zamiast tego działa dobrze, ale jeśli chcesz użyć .Equals, możesz porównać to z wartością zmiennej dopuszczającej wartość null, więc

where t.CustID.Value.Equals(custIdToQuery)
kloarubeek
źródło
9

Miałem ten sam problem, gdy próbowałem zrobić .Równa się z zerową liczbą dziesiętną. Użycie == zamiast tego działa dobrze. Wydaje mi się, że dzieje się tak, ponieważ nie próbuje dopasować dokładnego „typu” dziesiętnego? dziesiętnie.

Dave Stuart
źródło
4
Należy pamiętać, że jest to w kontekście an IQueryable, więc nie jest kompilowane do zwykłego kodu C #. Staje się wyrażeniem przekazywanym do dostawcy zapytań. Ten dostawca zapytań może robić z zapytaniem, co chce, i może obsługiwać Equalsi ==to samo lub nie.
Servy
Kiedyś .Equal(), aby porównać Int32?z Int32. Ponieważ Int32?ma zawierać Int32i null, pomyślałem, że zadziała. Ale tak się nie stało. ==pracował.
matryca
1

Miałem ten sam problem i porównywałem obiekt kolekcji "User"z typem danych całkowitoliczbowych "userid"( x.User.Equals(userid))

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

a poprawne zapytanie to x.UserId.Equals(userid)

from user in myshop.UserPermissions.Where(x => x.IsDeleted == false && x.UserId.Equals(userid))
Satish Kumar sonker
źródło
To inny problem, porównujesz jabłka i pomarańcze.
Lasse V. Karlsen
jak to się różni. podczas gdy ja napotkałem ten sam problem. po prostu zamieszczam tę odpowiedź w celach informacyjnych tylko dla innych.
Satish Kumar sonker
1

W moim przypadku zmieniłem bezpośrednie wywołanie (sender as Button).Textna połączenie pośrednie przy użyciu temp var, zadziałało. kod roboczy:

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

kod błędu:

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);
    }
vaheeds
źródło