Entity Framework - Linq - Impossibile creare un valore costante di tipo "System.Object". Solo tipi primitivi

entity-framework expression-trees linq

Domanda

Ho un metodo per creare un'espressione per una query linq per un dato tipo, proprietà e valore. Questo funziona meravigliosamente finché la proprietà sul tipo NON è annullabile. Ecco l'esempio da cui lavoro ( http://www.marcuswhitworth.com/2009/12/dynamic-linq-with-expression-trees ). Sto chiamando il metodo Equals sulla proprietà. Tuttavia ho scoperto che il metodo Equals per i tipi Nullable accetta un oggetto come parametro invece del tipo Nullable. Ho tentato di utilizzare GetValueOrDefault per nascondere i valori null ma EF non supporta questo metodo. Come semplice esempio, il seguente codice genererà un errore:

decimal? testVal = new decimal?(2100);
        var test = (from i in context.Leases where i.AnnualRental.Equals(testVal) select i).ToList();

Tuttavia se usi == invece del metodo Equals () funzionerà OK. Non sono sicuro di come convertire il codice in uso == invece di Equals () comunque. Qualsiasi suggerimento sarà molto apprezzato.

Risposta popolare

Se dici == , generi BinaryExpression con NodeType come ExpressionType.Equal . http://msdn.microsoft.com/en-us/library/bb361179.aspx

Se si specifica .Equals(x) , si genera un MethodCallExpression . Il MethodCallExpression che LinqToEntities può tradurre in Sql è un elenco limitato (ad esempio, nessuno dei tuoi metodi non decorati si trova in tale elenco). Nullable<T>.Equals(x) apparentemente non è in quella lista.

Non dire .Equals(x) a LinqToEntities.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow