Я использую универсальный шаблон репозитория с методами:
private ObjectQuery<T> ObjectQueryList()
{
var list = CamelTrapEntities.CreateQuery<T>(EntitySetName);
return list;
}
public IQueryable<T> List()
{
return ObjectQueryList();
}
Список Metod () возвращает IQueryable <T>, becase IQueryable <T> легко дразнить. У меня также есть дополнительный метод:
public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path)
{
if (obj is ObjectQuery<T>)
(obj as ObjectQuery<T>).Include(path);
return obj;
}
Этот метод используется за пределами репозитория для получения списка объекта со свойствами навигации, уже загруженными, например: Список. Включайте ("CreatedBy"). Проблема состоит в том, что это не работает. Все включает, проигнорированы. когда я изменяю Список () метод к
public ObjectQuery<T> List()
{
return ObjectQueryList();
}
все хорошо работает.
Как я должен реализовать шаблон репозитория, чтобы смочь выполнить более сложные запросы?
Reflector дал мне ответ:
public ObjectQuery<T> Include(string path)
{
EntityUtil.CheckStringArgument(path, "path");
return new ObjectQuery<T>(base.QueryState.Include<T>((ObjectQuery<T>) this, path));
}
Include возвращает новый объект ObjectQuery, а моя функция Include вернула старый объект. Переход на
public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path)
{
if (obj is ObjectQuery<T>)
return (obj as ObjectQuery<T>).Include(path);
return obj;
}
решил проблему. Потрачено несколько часов, и я больше ненавижу Entity Framework :)
Это заставило меня также понять, что я должен создать еще одну функцию List с параметром Include и не разрешать включение вне репозитория.
Переход наpublic static IQueryable<T> Include<T>(this IQueryable<T> obj, string path)
{
if (obj is ObjectQuery<T>)
return (obj as ObjectQuery<T>).Include(path);
return obj;
}
решил проблему. Потрачено несколько часов, и я больше ненавижу Entity Framework :)
Это заставило меня также понять, что я должен создать еще одну функцию List с параметром Include и не разрешать включение вне репозитория.
Переход наpublic static IQueryable<T> Include<T>(this IQueryable<T> obj, string path)
{
if (obj is ObjectQuery<T>)
return (obj as ObjectQuery<T>).Include(path);
return obj;
}
решил проблему. Потрачено несколько часов, и я больше ненавижу Entity Framework :)
Это заставило меня также понять, что я должен создать еще одну функцию List с параметром Include и не разрешать включение вне репозитория.
Здесь - наиболее полная реализация шаблона репозитория, которую я видел для EF. Я не могу сказать наверняка, позволит ли это вам использовать Include (), но если я правильно прочитал реализацию, он должен.