Utilizzando un var basata su un enum in una clausola WHERE in Entity Framework genera un'eccezione
-
19-09-2019 - |
Domanda
Ho il seguente codice che genera un'eccezione (dettaglio nei commenti del codice qui sotto). Sto semplicemente cercando di utilizzare un'istanza di un enum come parte della clausola WHERE. Capisco il messaggio, ma non capisco il motivo per cui EF non può analizzare un enum Int32.
Funziona se copio l'enum per un Int32 e poi filtrare su questo, ma sembra molto disordinato.
Enum MyEnum As Int32
Zero
One
Two
End Enum
Shared Function GetStuff(ByVal EnumValue As MyEnum) As IQueryable
Dim Db As New MainDb
Dim DetailList As IQueryable
Dim MyInt As Int32 = EnumValue
' PostalProviderId is an Int column in SQL.
'DetailList = From D In Db.DeliveryService Where D.PostalProviderId = EnumValue ' This fails.
DetailList = From D In Db.DeliveryService Where D.PostalProviderId = MyInt ' This works.
' The following attempt to enumerate the results yields;
' **** System.NotSupportedException was unhandled by user code
' **** Message = "Unable to create a constant value of type 'Closure type'. Only primitive types ('such as Int32, String, and Guid') are supported in this context."
' **** Source = "System.Data.Entity"
For Each Thingy In DetailList
Console.WriteLine(Thingy.ToString())
Next
Return DetailList
End Function
C'è una soluzione più elegante di copiare i valori enum ad un int locale?
Soluzione
Il problema è che il quadro entità non sa come eveluate tuo enum quando sta costruendo il T-SQL per ottenere l'int dietro di esso. La risposta breve è che si deve memorizzare in una variabile temporanea e l'uso che.
Qualche informazione in più sono disponibili all'indirizzo:
http://gmontrone.com /post/problem-with-casting-enums-in-linq-to-entities.aspx
e