Linq Query terus menampilkan “Tidak dapat membuat nilai konstan tipe System.Object…”, Mengapa?

94

Berikut ini adalah contoh kodenya:

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

saya tidak dapat memahami apa yang saya lakukan salah. Saya terus mendapatkan "Tidak dapat membuat nilai konstan jenis 'System.Object'. Hanya jenis primitif ('seperti Int32, String, dan Guid') yang didukung dalam konteks ini."

Neel
sumber

Jawaban:

232

Gunakan == alih-alih Sama dengan:

where t.CustID == custIdToQuery

Jika jenisnya salah, Anda mungkin menemukan bahwa ini tidak dapat dikompilasi.

Mark Byers
sumber
10
Bisakah Anda menjelaskan perbedaan antara "t.CustID == custIdToQuery" dan "t.CustID.Equals (custIdToQuery)". terima kasih sebelumnya
Neel
2
@Neel Lihat pertanyaan ini untuk penjelasan tentang perbedaan antara ==dan .Equals(): stackoverflow.com/questions/814878/…
Alex
Logika solusi 2011 berhasil untuk tahun 2018! Layak luar biasa!
Yeshwant Mudholkar
29

Saya memiliki masalah yang sama dengan int nullable. Menggunakan == malah berfungsi dengan baik, tetapi jika Anda ingin menggunakan .Equals, Anda dapat membandingkannya dengan nilai variabel nullable, jadi

where t.CustID.Value.Equals(custIdToQuery)
kloarubeek.dll
sumber
9

Saya memiliki masalah yang sama ketika saya mencoba melakukan .Sama dengan desimal nol. Menggunakan == malah berfungsi dengan baik. Saya kira ini karena tidak mencoba untuk mencocokkan "jenis" yang tepat dari desimal? ke desimal.

Dave Stuart
sumber
4
Perlu diingat bahwa ini dalam konteks sebuah IQueryable, jadi itu tidak dikompilasi menjadi kode C # biasa. Ini menjadi ekspresi yang diteruskan ke penyedia kueri. Penyedia kueri tersebut dapat melakukan apa pun yang diinginkan dengan kueri tersebut, dan dapat menangani Equalsdan ==sama atau tidak.
Pelayanan
Saya biasa .Equal()membandingkan Int32?dengan Int32. Karena Int32?seharusnya mengandung Int32dan null, saya pikir itu akan berhasil. Tapi ternyata tidak. ==bekerja.
matriks
1

Saya menghadapi masalah yang sama dan saya membandingkan Objek Koleksi "User"dengan tipe data integer "userid"( x.User.Equals(userid))

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

dan Query yang benar adalah x.UserId.Equals(userid)

from user in myshop.UserPermissions.Where(x => x.IsDeleted == false && x.UserId.Equals(userid))
Sonker Satish Kumar
sumber
Ini masalah yang berbeda, Anda membandingkan apel dan jeruk.
Lasse V. Karlsen
bagaimana itu berbeda. sementara saya menghadapi masalah yang sama. Saya hanya memposting jawaban ini untuk referensi hanya untuk orang lain.
Satish Kumar sonker
0

Dalam kasus saya, saya mengubah panggilan langsung (sender as Button).Textke panggilan tidak langsung menggunakan var temp, telah berhasil. kode kerja:

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

kode 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);
    }
vaheeds
sumber