Я работал над 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();
}