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."

Jawaban:


232

Gunakan == alih-alih Sama dengan:

where t.CustID == custIdToQuery

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


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)

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.


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

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);
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.