2016-07-25 3 views
0

У меня есть следующий (упрощенный) Entity SQL-запрос:Как можно ссылаться на тип перечисления в Entity SQL

SELECT VALUE a 
FROM Customers AS a 
WHERE a.Status NOT IN { 2, 3 } 

Свойство Status является типом перечисления, назовем его CustomerStatus. Перечисление определено в файле EDMX.

Как бы то ни было, этот запрос не работает, порождая исключение из-за того, что CustomerStatus несовместим с Int32 (его базовый тип - это int). Тем не менее, я не мог найти способ определить список значений CustomerStatus для предложения IN {} независимо от того, какое пространство имен я префиксует имени перечисления. Например,

SELECT VALUE a 
FROM Customers AS a 
WHERE a.Status NOT IN { MyModelEntities.CustomerStatus.Reject, MyModelEntities.CustomerStatus.Accept } 

не работает, выбрасывая исключение заявив, что не может найти MyModelEntities.CustomerStatus в контейнере, или некоторые такие.

В конце концов я прибегла к отливке Status в целое, такие как

SELECT VALUE a 
FROM Customers AS a 
WHERE CAST(a.Status AS System.Int32) NOT IN { 2, 3 } 

, но я надеялся на более элегантное решение.

+0

Не можете ли вы просто перевести enum в (int) до отправки запроса? –

+0

@ DanielLorenz, что вы имеете в виду? Как вы можете видеть в последнем запросе, в конце концов это то, что я сделал. –

+0

Вы строите SQL самостоятельно или используете DbSet? Если вы сами создаете SQL, вам нужно использовать int, поскольку в базе данных нет понятия перечисления. EF переводит это значение в int. –

ответ

0

Oooh, вы пишете Entity SQL напрямую. Я вижу ... Любая причина, по которой вы не используете DbSet вместо написания Entity SQL вручную? Может всегда делать

var statuses = new [] { Status.A, Status.B }; 
var query = context.SomeTable.Where(a => !statuses.Contains(a.Status)).ToList(); 
+0

Причина заключается в том, что запрос фактически генерируется динамически с помощью 'String.Format', заменяя выбранный столбец от сущности (фактический запрос фактически выбирает свойство навигации из' a') и модифицирует предложение WHERE. –

+0

Хмм, я действительно ничего не вижу здесь, что на самом деле гарантировало бы использование динамического SQL. Вы не можете делать ctx.Customers.Where (a => statuses ..). Выберите (a => a.Value) .ToList()? –

+0

Реальный запрос сложнее. Я могу выбрать 'a.ValueA' или' a.ValueB', и в дополнение к списку состояний предложение 'WHERE' имеет дополнительные динамические условия. Что-то вроде 'String.Format (« SELECT VALUE a. {0} FROM Customers AS a WHERE CAST (a.Status AS System.Int32) НЕ В {{2, 3}} И a. {1} НЕ НУЛЛ " , selectedProperty, filterProperty) ' –

Смежные вопросы