Utilizzando un var basata su un enum in una clausola WHERE in Entity Framework genera un'eccezione

StackOverflow https://stackoverflow.com/questions/1327599

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?

È stato utile?

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

http: // www .matthidinger.com / archive / 2008/02/26 / entità-quadro-confronto-frustrazione-explained.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top