2、你把当前用户保存为全局变量了,但是你发现currentUser.CompanyInfo因为上下文已经抛弃了,因此是无法使用的,业务层不得不每一次都重新从数据库读取该用户所属公司的数据。
这两种形式如下所示:
// 通过实体对象来存储
public double GetCurrentBalanceByObject()
{
int userId;
int.TryParse(HttpContext.Current.User.Identity, out userId);
UserInfo user = GetUser(userId);
CompanyInfo company = GetCompanyByUser(user);
IQueryable<TransactionInfo> transactions = GetTransactionsByCompany(company);
return transactions.Sum(item => item.Amount);
}
public UserInfo GetUser(int userId)
{
using(MyDataContext context = new MyDataContext)
{
return context.UserInfos.Where(item => item.UserId == userId).FirstOrDefault();
}
}
public CompanyInfo GetCompanyByUser(UserInfo user)
{
using(MyDataContext context = new MyDataContext)
{
return context.CompanyInfos.Where(item => item.UserId == user.Id).FirstOrDefault();
}
}
public IQueryable<Transaction> GetTransactionsByCompany(CompanyInfo company)
{
using(MyDataContext context = new MyDataContext)
{
return context.TransactionInfos.Where(item => item.CompnayId == company.Id);
}
}
public double GetCurrentBalanceByObject()
{
int userId;
int.TryParse(HttpContext.Current.User.Identity, out userId);
UserInfo user = GetUser(userId);
CompanyInfo company = GetCompanyByUser(user);
IQueryable<TransactionInfo> transactions = GetTransactionsByCompany(company);
return transactions.Sum(item => item.Amount);
}
public UserInfo GetUser(int userId)
{
using(MyDataContext context = new MyDataContext)
{
return context.UserInfos.Where(item => item.UserId == userId).FirstOrDefault();
}
}
public CompanyInfo GetCompanyByUser(UserInfo user)
{
using(MyDataContext context = new MyDataContext)
{
return context.CompanyInfos.Where(item => item.UserId == user.Id).FirstOrDefault();
}
}
public IQueryable<Transaction> GetTransactionsByCompany(CompanyInfo company)
{
using(MyDataContext context = new MyDataContext)
{
return context.TransactionInfos.Where(item => item.CompnayId == company.Id);
}
}
// 实际上很容易就退化为通过键值来存储,因为在这种设计方式下面,
// 实际上根本没有什么必要去传输整个对象。
// 我们可以想象,这个时候很多的操作其实是依赖UserId和CompanyId的,
// 而我见过的“有趣”设计,是在Page_Load事件中,不管是否需要用到,
// 都会将HttpContext.Current.User.Identity以及
// GetCompanyByUserId(userId).CompanyId保存为当前页面的全局变量。
// 其实这样是违背了Linq的设计初衷的。
// 下面就是一个只传Id的做法:
public double GetCurrentBalanceByObject()
{
int userId;
int.TryParse(HttpContext.Current.User.Identity, out userId);
CompanyInfo company = GetCompanyByUserId(userId);
IQueryable<TransactionInfo> transactions = GetTransactionsByCompanyId(company.CompanyId);
return transactions.Sum(item => item.Amount);
}
public CompanyInfo GetCompanyByUser(int userId)
{
using(MyDataContext context = new MyDataContext)
{
return context.CompanyInfos.Where(item => item.UserId == userId).FirstOrDefault();
}
}
public IQueryable<Transaction> GetTransactionsByCompanyId(int companyId)
{
using(MyDataContext context = new MyDataContext)
{
return context.TransactionInfos.Where(item => item.CompnayId == companyId);
}
}
// 实际上根本没有什么必要去传输整个对象。
// 我们可以想象,这个时候很多的操作其实是依赖UserId和CompanyId的,
// 而我见过的“有趣”设计,是在Page_Load事件中,不管是否需要用到,
// 都会将HttpContext.Current.User.Identity以及
// GetCompanyByUserId(userId).CompanyId保存为当前页面的全局变量。
// 其实这样是违背了Linq的设计初衷的。
// 下面就是一个只传Id的做法:
public double GetCurrentBalanceByObject()
{
int userId;
int.TryParse(HttpContext.Current.User.Identity, out userId);
CompanyInfo company = GetCompanyByUserId(userId);
IQueryable<TransactionInfo> transactions = GetTransactionsByCompanyId(company.CompanyId);
return transactions.Sum(item => item.Amount);
}
public CompanyInfo GetCompanyByUser(int userId)
{
using(MyDataContext context = new MyDataContext)
{
return context.CompanyInfos.Where(item => item.UserId == userId).FirstOrDefault();
}
}
public IQueryable<Transaction> GetTransactionsByCompanyId(int companyId)
{
using(MyDataContext context = new MyDataContext)
{
return context.TransactionInfos.Where(item => item.CompnayId == companyId);
}
}
如果你是第一种情况,那么很明显,你会有大量重复的SQL调用。