嗯,这里有另一个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);
}
那么,有可能吗?如果是这样,最好的方法是什么?
答案 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;
}