通过重写ObjectQuery ESQL永久限制EF结果集

时间:2010-11-23 14:38:25

标签: entity-framework reflection entity-framework-4 entity-sql

有没有人知道如何永久限制EntityFramework的结果集?我说的是这样的Conditional Mapping。这正是我想要实现的一个例外:我想以编程方式执行此操作。这是因为条件值仅在上下文创建时传递给EF。除此之外,我不希望此列从映射中消失。

我知道如何使用EF2.0和反射实现这一目标。我使用CreateQuery()方法生成自己的ObjectQueryCreateQuery()允许使用附加条件注入我自己的ESQL查询,例如WHERE TABLE.ClientID == value

EF40的问题是不再有ObjectQuery但仅使用ObjectSetCreateQuery()。我不知道如何注入我自己的ESQL查询。

我想限制结果集的原因是我想将客户端数据彼此分开。这种分离应该在上下文中自动完成,这样程序员就不必为每个单独的查询添加条件.Where(x => x.ClientID == 5)

也许我的做法非常糟糕 - 但我不知道其他选择。

1 个答案:

答案 0 :(得分:1)

你不需要反思。您可以简单地使用从ObjectContext继承的类或创建UnitOfWork和Repositories的自定义实现,它将以更好的方式包装此功能(上层只能访问不暴露EF上下文的UnitOfWork和Repositories)。

对象上下文的简单示例:

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