2010-08-19 75 views
1

如果我有从基础实体继承的实体(比如说“小工具”,“小工具”和“小工具”从“设备”继承),我想查询设备并返回每个项目中产生的投影的具体类型,就像这样:Linq2EF在查询投影中返回子类的类型

from d in Devices 
select new 
{ 
    Name = d.Name, 
    Type = d.GetType() 
}; 

这将返回类似的列表:

Spring, Widget 
Gear, Gizmo 
Tape, Gadget 
Scissors, Gizmo 
Screw, Widget 

当然,EF抱怨,因为的GetType()是不是SQL Server cannonical功能。有没有办法做到这一点?

回答

1

有两种方法。如果只涉及几种类型,你可以这样做:

from d in Devices 
let typeName = d is Spring ? "spring" : d is Widget ? "widget" : "etc." 
select new 
{ 
    Name = d.Name, 
    Type = typeName 
}; 

丑陋,但在案件中必要。

或者,进入L2O:

(from d in Devices 
select new 
{ 
    Name = d.Name, 
    Obj = o 
}).AsEnumerable() 
    .Select(
    d => new 
      { 
       Name = d.Name, 
       Type = d.GetType() 
      }); 
+0

第一种方法工作得很好,因为我有已知类型的数量有限,不想列举的数据。 – CodeGrue 2010-08-20 13:56:46