2011-01-04 26 views
72

Aşağıdaki kod örneği:Linq Query, "System.Object türünde sabit bir değer oluşturulamadı ...", neden atılıyor?

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

Neyi yanlış yaptığımı anlayamıyorum. Xzx44 almaya devam ediyorum "Sabit bir tip 'System.Object' oluşturulamıyor. Bu bağlamda yalnızca ilkel türler ('Int32, String ve Guid' gibi) destekleniyor."

cevap

170

Kullanım == yerine Eşittir:

where t.CustID == custIdToQuery 

tipleri doğru değilse bu derleme değil bulabilirsiniz.

+2

sayesinde :( – Neel

+9

"t.CustID == custIdToQuery" ve "t.CustID.Equals (custIdToQuery)" arasındaki farkı açıklar mısınız. şimdiden teşekkürler – Neel

+0

@Neel '==' ve '.Equals()' arasındaki fark hakkında açıklama için şu soruya göz atın: http://stackoverflow.com/questions/814878/c-sharp-difference-between- ve eşittir – Alex

7

Yapmaya çalıştığımda aynı sorunu yaşadım. Nüksetilebilir ondalıklarla doldurulur. Kullanımı == bunun yerine güzel çalışır. Bunun nedeni, ondalık tam "tür" eşleşmeye çalışmıyor çünkü? ondalık

+4

Bunun bir “IQueryable” bağlamında olduğunu unutmayın, bu nedenle normal C# koduna göre derlenmez. Bir sorgu sağlayıcısına iletilen bir ifade olur. Bu sorgu sağlayıcı sorgu ile ne isterse yapabilir ve 'Eşittir 've' == 'aynı ya da değil işleyebilir. – Servy

+0

"Int32" yi Int32 ile karşılaştırmak için '.Equal()' işlevini kullandım. “Int32” nin “Int32” ve “null” ı içerdiği varsayıldığından, bunun işe yarayacağını düşündüm. Ama öyle olmadı. '= çalıştı. – matrix

21

Nullable int ile aynı sorunu yaşadım. == kullanma yerine güzel çalışır, ancak .Equals kullanmak istiyorsanız, bunu

where t.CustID.Value.Equals(custIdToQuery) 
-1

Ben aynı sorunu karşı karşıya geldi ve ben birlikte koleksiyon nesnesi karşılaştırıyordum, null değişkenin değeri ile karşılaştırabilir tamsayı veri türü "userid" (x.User.Equals(userid))

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

ve doğru Sorgu LinQ bana zorluk veriyor adam x.UserId.Equals(userid)

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

Bu farklı bir problem, elmaları ve portakalları karşılaştırıyorsunuz. –

+0

nasıl farklıdır. Ben aynı sorunu yaşadım. Bu cevabı sadece başkaları için referans olarak gönderdim. –

İlgili konular