Context.CreateQuery <T>загружает все? - PullRequest
0 голосов
/ 25 августа 2010

Я работал над 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 голосов
/ 25 августа 2010

Спасибо за все ответы, я получил его, включив строку:

Context.ContextOptions.LazyLoadingEnabled = false;

в методе CreateQuery в базовом классе это сработало (я пробовал это раньше, чем я уверен на 80%)

Ну да ладно:)

0 голосов
/ 25 августа 2010

Джеймс, я знаю, что ты решил это, чувак, но ты также пытался выяснить, можешь ли ты использовать методы частичного отбора (я думаю, что в EF), такие как Skip & Take.

Я должен признать,Я часто забываю о отложенной загрузке, но в долгосрочной перспективе это никогда не вызывает проблем, потому что я никогда не извлекаю из БД больше, чем нужно.

Просто мысль ....

Я больше человек L2S ....

хе ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...