Постоянное ограничение набора результатов EF путем переопределения ObjectQuery ESQL - PullRequest
0 голосов
/ 23 ноября 2010

Кто-нибудь знает, как навсегда ограничить набор результатов EntityFramework?Я говорю о чем-то вроде этого Условное отображение .Это именно то, чего я хочу достичь, за одним исключением: я хочу сделать это программно.Это потому, что значение условия будет передано в EF только при создании контекста.Кроме того, я не хочу, чтобы этот столбец исчез из картографирования.

Я знаю, как этого добиться с помощью EF2.0 и рефлексии.Я использовал CreateQuery() метод для генерации моего ObjectQuery.CreateQuery() позволяет вводить мой собственный запрос ESQL с дополнительным условием, например, WHERE TABLE.ClientID == value.

Проблема с EF40 заключается в том, что больше нет ObjectQuery, но только ObjectSet и CreateQuery() не используются.Я не знаю, как внедрить свой собственный запрос ESQL.

Причина, по которой я хочу ограничить наборы результатов, заключается в том, что я хочу отделить данные клиентов друг от друга.Это разделение должно выполняться автоматически внутри контекста, чтобы программистам не приходилось добавлять условие .Where(x => x.ClientID == 5) к каждому отдельному запросу.

Возможно, мой подход совершенно плох - но я не знаю альтернативы.

1 Ответ

1 голос
/ 23 ноября 2010

Вам не нужно размышление для этого.Вы можете просто использовать класс, унаследованный от ObjectContext, или создать собственную реализацию UnitOfWork и Repositories, которая будет лучше оборачивать эту функцию (верхний уровень имеет доступ только к UnitOfWork и Repositories, которые не предоставляют контекст EF).контекста объекта:

public class CustomContext : ObjectContext
{
  private ObjectSet<MyObject> _myObjectsSet;
  private int _clientId;

  public CustomContext(string connectionString, int clientId)
    : base(connectionString)
  {
    _myObjectSet = CreateObjectSet<MyObject>();
    _clientId = clientId;
  }

  public IQueryable<MyObject> MyObjectQuery
  {
    get
    {
      return _myObjectsSet.Where(o => o.ClientId == _clientId);
    }
  }
}
...