Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF、抽象和泛型扩展编译器在这里做什么?_C#_Entity Framework_Generics - Fatal编程技术网

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;
}