2016-04-07 50 views
1

我有一些实体Logging它实现ILogging,比方说,它只有两个属性:与表达泛型类抛出错误在LINQ到实体

public partial class Logging : ILogging 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 
} 
public interface ILogging { int ID {get; set;} } 

我本来有一个静态类Logging.Q其中包含静态Expression<Func<Logging,bool>>领域,但现在我希望能够写表达式ILogging,如果他们只需要ID

public partial class Logging 
{ 
    public static Q<T> where T : ILogging 
    { 
     public static Expression<Func<T,bool>> IDOne = l => l.ID == 1; 
    } 
} 

当我打电话这样的表达:

var log = ctx.Logging.Where(Logging.Q<Logging>.IDOne).FirstOrDefault(); 

我得到了臭名昭著的 “LINQ到实体只支持...”:

无法转换类型'Entities.Logging为键入 'Entities.ILogging'。 LINQ to Entities仅支持投射EDM基元或枚举类型。

但我不知道为什么。我在类Q上定义了我的泛型类型,所以运行时应该知道我正在处理Logging而不是ILogging。有没有办法解决?

+0

怎么来记录类的初始定义没有打上关键字部分或只是ommitted这里 – TYY

+0

@TYY在 –

+1

中编辑它我不知道这是否能解决您的问题,但是在某个时间点,我记得必须将类添加到约束中。所以我曾在哪T级,ILogging – TYY

回答

2

听起来像一个C#编译器错误或表达式树中的缺陷。

当约束where T : ILoggingwhere T : struct, ILogging,所产生的表达是{l => (Convert(l).ID == 1)},即包括铸造(注意Convert),其又导致臭名昭著EF异常。

然而,把一个class约束消除了演员和EF只是快乐:

where T : class, ILogging结果{l => (l.ID == 1)}

+0

类约束做到了 –