.CreateObjectSet <T>,.Set <T>和.CreateQuery <T>之间的区别?

Sve*_*ang 10 generics datacontext entity-framework

我正在为实体框架编写一个通用存储库,并对这些调用之间的区别感到困惑:

ObjectContext.CreateObjectSet<T>
ObjectContext.CreateQuery<T>
DbContext.Set<T>
Run Code Online (Sandbox Code Playgroud)

我想要一个通用的存储库,它既支持从.edmx文件生成的上下文,也支持代码第一个DbContext,所以我有这个:

 public abstract class EntityRepository<TClass>
   where TClass : class, new()
{
    //private readonly TContext _context;
    private readonly ObjectSet<TClass> _objectSet;

    protected EntityRepository(IObjectContextAdapter context)
    {
        _objectSet = context.ObjectContext.CreateObjectSet<TClass>();

    }

    protected EntityRepository(ObjectContext context)
    {
        _objectSet = context.CreateObjectSet<TClass>();
    }

    public ObjectSet<TClass> Query()
    {
        return _objectSet;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我在网上看过的例子中,我看过所有使用过的3个,它们之间的实际差异是什么?一个更好的表现明智吗?我知道你可以使用所有3种方法针对上下文编写LINQ查询.

cin*_*net 16

CreateObjectSet<T>你的回报ObjectSet<T>这基本上集合T对象,具有添加,删除能力,从...以后导致以插入此集合对象,删除,......你也可以用它来查询.它就像给定实体的顶级根.

CreateQuery<T>给你ObjectQuery<T>,这可以被看作像IEnumerable<T>(这也是IQueryable<T>).此对象类似于ObjectSet<T>(某些条件等)的子集,但您无法向其中添加项目,依此类推.

最后Set<T>返回的DbSet<T>是Code First的第一个方法/对象的简化版本.例如,更容易使用这些对象(或更好地说接口; IDbSet<T>),即单元测试等.类似于什么ObjectContextDbContext是.

  • 从根本上说,和ObjectSet <T>:ObjectQuery <T>.使用一个或另一个构建查询不会影响查询执行.与CreateQuery(我们进行一些元数据查找)相比,对CreateObjectSet的调用开销最小,但如果这种开销在现实世界中有任何可观察到的影响,我会感到惊讶.DbContext API上Set <T>的实现实际上是其他方法的薄层.它也不应该产生重大影响,并且整个DbContext更简单,更容易使用API​​. (2认同)