2011-01-04 3 views
72

Im Folgenden ist das Codebeispiel:Linq Query wirft weiter "Konnte keinen konstanten Wert vom Typ System.Object erstellen ....", Warum?

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

ich bin nicht in der Lage zu verstehen, was ich falsch mache. Ich bekomme immer "Konnte keinen konstanten Wert vom Typ 'System.Object' erstellen. Nur primitive Typen ('wie Int32, String und Guid') werden in diesem Kontext unterstützt."

Antwort

170

Verwendung == statt Equals:

where t.CustID == custIdToQuery 

Wenn die Typen nicht korrekt sind, können Sie feststellen, dass dies nicht kompiliert.

+2

dank Mann LinQ mir eine harte Zeit zu geben :( – Neel

+9

Können Sie den Unterschied zwischen "t.CustID == custIdToQuery" und "t.CustID.Equals (custIdToQuery)" erläutern? Vielen Dank im Voraus – Neel

+0

@Neel Werfen Sie einen Blick auf diese Frage, um den Unterschied zwischen '==' und '.Equals()' zu erklären: http://stackoverflow.com/questions/814878/c-sharp-difference-between- und-gleich – Alex

7

Ich hatte das gleiche Problem, wenn ich versuchte, .Equals mit einer nullwertfähigen Dezimalzahl zu tun. Die Verwendung von == funktioniert stattdessen gut. Ich denke, das liegt daran, dass es nicht versucht, den genauen "Typ" der Dezimalzahl zu finden? zu dezimal.

+4

Beachten Sie, dass dies im Zusammenhang mit einem "IQueryable" steht, also wird es nicht in regulären C# -Code kompiliert. Es wird zu einem Ausdruck, der an einen Abfrageanbieter übergeben wird. Dieser Abfrageanbieter kann mit der Abfrage alles tun, was er möchte, und er kann "Equals" und "==" gleich behandeln oder nicht. – Servy

+0

Ich habe '.Equal()' verwendet, um 'Int32?' Mit 'Int32' zu vergleichen. Da 'Int32?' 'Int32' und' null' enthalten soll, dachte ich, es würde funktionieren. Aber es tat es nicht. '==' hat funktioniert. – matrix

21

Ich hatte das gleiche Problem mit einem Nullable Int. Mit funktioniert == statt schön, aber wenn man .Equals verwenden möchten, können Sie es auf den Wert der Nullable-Variable vergleichen, so

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

ich das gleiche Problem konfrontiert war und ich den Vergleich Collection Object mit integer-Datentyp "userid" (x.User.Equals(userid))

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

und korrekte Abfrage ist x.UserId.Equals(userid)

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

Dies ist ein anderes Problem, Sie vergleichen Äpfel und Orangen. –

+0

wie es anders ist. während ich demselben Problem gegenüberstand. Ich poste diese Antwort nur als Referenz für andere. –

Verwandte Themen