C# EF、抽象和泛型扩展编译器在这里做什么?
我有一个用于我的实体的公共接口的扩展方法C# EF、抽象和泛型扩展编译器在这里做什么?,c#,entity-framework,generics,C#,Entity Framework,Generics,我有一个用于我的实体的公共接口的扩展方法 public static IQueryable<T> IsEdited<T>(this IQueryable<T> source) where T : IAuditData { return from o in source where o.CreatedOn != o.UpdatedOn select o; } 我明白了 无法将类型“IUserD
public static IQueryable<T> IsEdited<T>(this IQueryable<T> source)
where T : IAuditData
{
return from o in source
where o.CreatedOn != o.UpdatedOn
select o;
}
我明白了
无法将类型“IUserData”强制转换为类型
“IAuditData”。LINQ仅适用于实体
支持转换实体数据模型基元类型
IUserData也是一个接口,我使用它来抽象DbContext的DbSet属性
IQueryable<IUserData> Users { get { ... } }
IQueryable用户{get{…}
但如果我添加一个类约束,一切都很好
public static IQueryable<T> IsEdited<T>(this IQueryable<T> source)
where T : class, IAuditData
{
return from o in source
where o.CreatedOn != o.UpdatedOn
select o;
}
公共静态IQueryable已编辑(此IQueryable源)
其中T:class,IAuditData
{
从源中的o返回
其中o.CreatedOn!=o.UpdatedOn
选择o;
}
这让我很高兴。
但是编译器是如何告诉EF T是引用类型的呢?
struct
类型是。如果不将参数约束为类,它也可以是结构。传递给EF的表达式树不同。在没有类约束的情况下,where子句实体被强制转换到接口,例如:(System.Nullable`1[System.DateTime])((Antix.Data.Entity.interface.IAuditData)$o)。CreatedOn!=((Antix.Data.Entity.Interface.IAuditData)$o)。更新您的任何注释都比公认的答案更有用。:)我想知道编译器到底在做什么,但这确实解释了ef抛出错误的原因-谢谢
public static IQueryable<T> IsEdited<T>(this IQueryable<T> source)
where T : class, IAuditData
{
return from o in source
where o.CreatedOn != o.UpdatedOn
select o;
}