Использование переменной на основе перечисления в предложении Where в Entity Framework вызывает исключение - PullRequest
0 голосов
/ 25 августа 2009

У меня есть следующий код, который выдает исключение (подробности в комментариях к коду ниже). Я просто пытаюсь использовать экземпляр enum как часть предложения Where. Я понимаю сообщение, но не понимаю, почему EF не может проанализировать перечисление Int32.

Это работает, если я копирую enum в Int32, а затем фильтрую его, но это выглядит очень грязно.

    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

Есть ли более элегантное решение, чем копирование значений перечисления в локальный int?

1 Ответ

3 голосов
/ 25 августа 2009

Проблема в том, что структура сущностей не знает, как выявить ваше перечисление, когда оно строит T-SQL, чтобы получить int за ним. Короткий ответ: вы должны сохранить его во временной переменной и использовать его.

Дополнительную информацию можно найти по адресу:

http://gmontrone.com/post/problem-with-casting-enums-in-linq-to-entities.aspx

и

http://www.matthidinger.com/archive/2008/02/26/entity-framework-comparison-frustration-explained.aspx

...