Как запросить EF через PK при использовании универсального класса? - PullRequest
0 голосов
/ 08 января 2011

Я пытаюсь реализовать универсальный класс, который будет взаимодействовать с универсальным репозиторием, и все в порядке, за исключением случаев, когда мне приходится иметь дело с извлечением объектов из репозитория.

Я собираюсьВ общем классе есть виртуальный метод, который получит int, и я хочу использовать этот int для формирования запроса к хранилищу, которое получает объекты по их первичному ключу.У меня есть чувство, что мне нужно работать со свойством EntityKey в EF, но я не совсем уверен, как.

В любом случае, вот что я пытаюсь сделать в коде, я надеюсь, что у кого-то будут предложения о том, какчтобы выполнить то, что я хочу:

public virtual T Get(int PrimaryKey) {
    this.Repository.Select(
        t =>
            (t.PRIMARYKEY == PrimaryKey)).Single();
}

Я хочу расширить этот класс более специализированными классами, но, поскольку большинство из них получают свои объекты только при запросе PK, это значит, что мне нужен базовый методкоторый может это сделать.

Заранее благодарен за любые предложения!

ОБНОВЛЕНИЕ

Итак, вот где я получил с отражением, и ясомневаюсь, что это правильный путь, но он несколько работает ... Я получаю NotSupportedException с сообщением LINQ to Entities не распознает метод 'System.Object GetValue (System.Object, System.Object []), и этот метод нельзя преобразовать в выражение хранилища. .Хотя я понимаю, что он говорит и почему он говорит, я не уверен, как преодолеть это, когда мой код выглядит так:

private readonly string TEntityName = typeof(T).Name;

public virtual T Get(
    int PrimaryKey) {
    return this.Repository.Select(
        t =>
            (((int)t.GetType().GetProperties().Single(
                p =>
                    (p.Name == (this.TEntityName + "Id"))).GetValue(t, null)) == PrimaryKey)).Single();
}

Надеюсь, что кто-то, кто знает, как использовать отражение, в отличие от меня, можетНаправь меня в правильном направлении.Спасибо!

Ответы [ 2 ]

1 голос
/ 08 января 2011

Для извлечения сущности с помощью PK с использованием EF требуется выражение / предикат, например:

Expression<Func<Order,bool>> predicate = x => x.OrderId == 1;
return ctx.Orders.Single(predicate);

Нет простого способа (если не считать отражение или создание дерева выражений), чтобы иметь возможность динамически создавать этоПредикат.

Что вы можете сделать, это принять предикат в качестве параметра:

public virtual T Get(Expression<Func<T,bool>> predicate) {
    this.Repository.Select(predicate).Single();
}

Также убедитесь, что вы наложили некоторые общие ограничения на T (либо на уровне класса / метода).

0 голосов
/ 08 января 2011

http://msdn.microsoft.com/en-us/library/bb738961.aspx это путь.Затем используйте http://msdn.microsoft.com/en-us/library/bb738607.aspx,, проведите некоторое время в отладчике, и ваша миссон завершится.

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