2016-07-25 80 views
0

我有以下的(简化)实体SQL查询:如何引用枚举类型的实体SQL

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

Status属性是一个枚举类型,称之为CustomerStatus。枚举在EDMX文件中定义。

事实上,此查询不起作用,抛出了CustomerStatus与Int32不兼容的异常(其基础类型 int)。然而,我无法找到一种方法来为IN {}子句定义CustomerStatus值的列表,而不管我在枚举名称前加了哪个名称空间。例如,

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

没有工作,抛出异常说在容器中,它无法找到MyModelEntities.CustomerStatus,或一些这样的。

最后,我使出铸造Status为int,如

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

,但我希望一个更优雅的解决方案。

+0

你不能在发送查询之前将枚举强制转换为(int)吗? –

+0

@DanielLorenz你是什么意思?正如你在上一个查询中看到的,最终这就是我所做的。 –

+0

你是自己构建SQL还是使用DbSet?如果您自己构建SQL,则必须使用int,因为数据库没有枚举的概念。 EF将其转换为int。 –

回答

0

Oooh,你直接写实体SQL。我看到......任何你不使用DbSet而是用手写实体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 ..)。Select(a => a.Value).ToList()? –

+0

实际的查询比较复杂。我可以选择'a.ValueA'或'a.ValueB',除了状态列表外,'WHERE'子句还有其他的动态条件。类似于“String.Format(”SELECT VALUE a。{0} FROM Customers AS WHERE CAST(a.Status AS System.Int32)NOT IN {{2,3}}和a。{1} IS NOT NULL“ ,selectedProperty,filterProperty)' –