Платформа объекта и проблема шаблона репозитория

Я использую универсальный шаблон репозитория с методами:

    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();
    }

все хорошо работает.

Как я должен реализовать шаблон репозитория, чтобы смочь выполнить более сложные запросы?

6
задан LukLed 26 September 2009 в 15:50
поделиться

2 ответа

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 и не разрешать включение вне репозитория.

6
ответ дан 16 December 2019 в 21:43
поделиться

Здесь - наиболее полная реализация шаблона репозитория, которую я видел для EF. Я не могу сказать наверняка, позволит ли это вам использовать Include (), но если я правильно прочитал реализацию, он должен.

1
ответ дан 16 December 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: