为每个LINQ Select查询添加WHERE子句

时间:2012-11-27 15:48:19

标签: asp.net-mvc linq azure ef-code-first

我在Azure MVC应用程序中使用EF4 Code First从SQL Azure数据库中检索数据。

该应用程序总共有大约200个用户,分布在十几个使用相同应用程序的组织中。 SQL Azure DB将主要存储客户端联系信息等。

SQL Azure数据库中的所有表都包含一个名为OrgansiationId的字段,该字段是每个组织唯一的GUID。保存的所有数据包括与保存数据的人员组织相对应的OrganisationId。

用户只能添加/编辑/查看自己组织的信息。

所以我的问题是,建议使用LINQ的方法是什么,以确保任何Select语句只返回Users OrganisationId的信息,而不必手动将“WHERE OrganisationId == organisationId”附加到每个Select语句,这是易受攻击的人为错误。 (即忘记包括它以便Organsation不被过滤,噩梦场景!)

是否有一种可接受的方法来实现这一点,可能是通过使用附加的WHERE语句包装LINQ语句,以便自动完成所有LINQ Select语句?

1 个答案:

答案 0 :(得分:2)

我实施了一个非常相似的应用。我只是将DbContext包装在一个包装的上下文中:

当这是原始背景时:

public class MyContext : DbContext {
    public DbSet<MyTable> MyTable { get; set; }
}

然后包装的上下文如下所示:

public class MyWrappedContext {
    protected MyContext InternalContext { get; set; }
    public Guid OrganizationId { get; set; }

    public IQueryable<MyTable> MyTable 
    {
        get 
        { 
            return InternalContext.MyTable
               .Where(t => t.OrganizationId == OrganizationId); 
        } 
    }
}

为了添加,删除和更新实体,我在WrappedContext上有以下方法:

public void Add<T>(T entity) where T : class
{
    DbEntityEntry<T> dbEntityEntry = InternalContext.Entry(entity);
    dbEntityEntry.State = EntityState.Added;
}

public void Remove<T>(T entity) where T : class
{
    DbEntityEntry<T> dbEntityEntry = InternalContext.Entry(entity);
    dbEntityEntry.State = EntityState.Deleted;
}

public void Update<T>(T entity) where T : class
{
    DbEntityEntry<T> dbEntityEntry = InternalContext.Entry(entity);
    dbEntityEntry.State = EntityState.Modified;
}