Context.CreateQuery <t>正在加载所有内容吗?</t>

时间:2010-08-25 13:59:01

标签: .net .net-4.0 entity-framework-4

我一直在为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 个答案:

答案 0 :(得分:0)

詹姆斯,我知道你解决了这个问题,但是你也试着看看你是否可以使用部分选择方法(我认为在EF中),例如Skip&amp;取。

我必须承认,我经常忘记延迟加载,但从长远来看,它永远不会是一个问题,因为我从来没有从数据库中获取更多的东西。

只是一个想法......

我更像是一个L2S人......

嘿...

答案 1 :(得分:0)

感谢所有回复,我通过包含以下内容获得了它的工作:

Context.ContextOptions.LazyLoadingEnabled = false;

在基类的CreateQuery方法中,这个工作,(我在80%肯定之前尝试过这个)

但是哦,好吧:)。