实体框架战略/方法

时间:2017-07-25 22:38:40

标签: entity-framework-6

嗯,这里有另一个noob问题:所以我做了这个应用程序,不同的客户可以访问他们的帐户。一切都好,他们登录,我可以通过角色获得谁通过实体框架得到什么。问题是,随着时间的推移,数据库将会增长很多。例如:客户可以访问他们的“支付账单”。目前,只有几千个,一个简单的“Where”lambda表达式可以解决这个问题。但正如所说,基地将会增长。 场景:每个记录都有一个“公司”字段,用于确定记录所属的公司。用户具有角色,我存储特定用户可以访问数据的公司。因此,如果以这种方式配置,则一个用户可以访问多个公司数据。 我的问题是:有没有办法初始化传递用户角色的实体框架范围,因此范围包含“属于”该用户的数据?类似的东西:

using (MyThingy scope = new MyThingy(user.Roles))
{
    //scope.Bills here will contain only bills which "payer" or "holder" 
    //are companies within user.Roles
    List<Bill> billsToPay = scope.Bills.Where(c => 
    c.DueDate == DateTime.Now);

}

那么,有可能吗?如果是这样,最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。您可能想要阅读联接。以下是一些可行的方法:

// brings back a lot of Bills from the db into memory......
using (DbContext scope = new DbContext())
{
    //scope.Bills here will contain only bills which "payer" or "holder" 
    //are companies within user.Roles
    IEnumerable<Bill> billsToPay = scope.Bills.Where(c => c.DueDate == DateTime.Now );


    // this part happens in memory
    List<Bill> bills = billsToPay
    .Where(c => user.Roles.Any(role => c.payer == role.payer || c.holder == role.holder))
    .ToList();

}

// more efficient.. I did this from memory.  Syntax may not be perfect....

using (DbContext scope = new DbContext())
{
    //scope.Bills here will contain only bills which "payer" or "holder" 
    //are companies within user.Roles

    var query = from u in scope.Users
    from role in u.Roles
    from b in scope.bills.Where(b => b.DueDate == DateTime.Now && (b.roleID == role.roleID || b.holderID == role.holderID))
    where u.userID == user.userID
    select b;
}