通用实体框架和IQueryable <t> </t>

时间:2012-08-10 12:31:37

标签: entity-framework

我开始考虑通用EF方法,我发现帖子http://blog.damianbrady.com.au/2012/03/07/a-generic-crud-repository-for-entity-framework/

代码段:

protected Dictionary<string, object> CachedObjects = new Dictionary<string, object>();

protected ObjectSet<TEntity> GetObjectSet<TEntity>() where TEntity : EntityObject
{
   var fulltypename = typeof(TEntity).AssemblyQualifiedName;
   if (fulltypename == null)
       throw new ArgumentException("Invalid Type passed to GetObjectSet!");
   if (!CachedObjects.ContainsKey(fulltypename))
   {
       var objectset = base.CreateObjectSet<TEntity>();
       CachedObjects.Add(fulltypename, objectset);
   }
            return CachedObjects[fulltypename] as ObjectSet<TEntity>;
}

...

public TEntity GetFirstOrDefault<TEntity>(Func<TEntity, bool> predicate) where TEntity : EntityObject
{
   return GetObjectSet<TEntity>().FirstOrDefault(predicate);
}

现在,如果两行代码相等?

adapter.db.GetFirstOrDefault<MyTable>(x => x.ID == 1);
adapter.db.MyTable.FirstOrDefault(x => x.ID == 1);

我问,因为我不想将所有项目加载到内存中,然后对它们进行一些过滤。是否有任何方法可以像IQueryable<T>那样进行通用操作?

1 个答案:

答案 0 :(得分:1)

  

我问,因为我不想将所有项目加载到内存中   然后对它们进行一些过滤。有没有办法做到这一点   像IQueryable这样的通用操作?

它会加载所有项目并在内存中进行过滤,因为它使用Func<TEntity, bool>而不是Expression<Func<TEntity, bool>>。此外,它使用一些无用的基础设施来追逐集合。您只需使用objectContext.CreateObjectSet<TEntity>来获取对象集。