代码之家  ›  专栏  ›  技术社区  ›  JamesStuddart

context.createQuery<t>是否加载所有内容?

  •  0
  • JamesStuddart  · 技术社区  · 15 年前

    我一直在为EF4工作,做了很多事情,它的工作非常好,我遇到的一个问题是:context.createQuery返回正确,但它也加载了它的所有相关实体!?

    一旦数据库中有真实的数据,这将导致巨大的问题。

    关于如何阻止它加载所有相关实体有什么想法吗?

    以下是我所拥有的一小部分:

    原始呼叫:

    public ObjectNameHere GetById(Guid id)
        {
            return Query(p => p.Id == id).SingleOrDefault();
        }
    

    供应商基础

    private static Type GetBaseType(Type type)
        {
            var baseType = type.BaseType;
            if (baseType != null && baseType != typeof(EntityObject))
            {
                return GetBaseType(type.BaseType);
            }
            return type;
        }
    
        private static bool HasBaseType(Type type, out Type baseType)
        {
            var originalType = type.GetType();
            baseType = GetBaseType(type);
            return baseType != originalType;
        }
    
        private IQueryable<T> CreateQuery<T>()
        {
            Type baseType;
            return HasBaseType(typeof(T), out baseType)
                       ? Context.CreateQuery<T>(ProviderHelper.GetEntitySetName(Context, baseType.Name)).OfType<T>()
                       : Context.CreateQuery<T>(ProviderHelper.GetEntitySetName(Context, baseType.Name));
        }
    

    提供程序帮助程序

        public static string GetChildTypeNames(Type[] childTypes)
        {
            var context = ContextProvider.Context;
    
            var childNames = new StringBuilder();
    
            for (var i = 0; i < childTypes.Count(); i++)
            {
                childNames.Append(GetEntitySetName(context,childTypes[i].Name));
    
                if (i != childTypes.Count()) { childNames.Append("."); }
            }
            return childNames.ToString();
        }
    
        public static string GetEntitySetName(ObjectContext context, string entityTypeName)
        {
    
            var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
            return (from meta in container.BaseEntitySets
                                    where meta.ElementType.Name == entityTypeName
                                    select meta.Name).FirstOrDefault();
        }
    
    2 回复  |  直到 15 年前
        1
  •  0
  •   shawty    15 年前

    詹姆斯,我知道你解决了它,伙计,但你也试着看看你是否可以使用部分选择方法(我认为在英孚有)如skip&take。

    我不得不承认,我经常忘记懒惰的加载,但从长远来看,这并不是真正的问题,因为我从未从数据库中提取过比我需要的更多的数据。

    只是一个想法…

    我更像是一个大二的人……

    嗯…

        2
  •  0
  •   JamesStuddart    15 年前

    感谢所有的回复,我把这句话包括在内:

    context.contextoptions.lazyloadingenagenabled=false;

    在基类中的createQuery方法中,这是有效的(我在80%确定之前就尝试过这个方法)。

    但哦,好吧:)