从控制器查询从存储库获得的List 增加耦合?
|
我有一个用C#编码的ASP.NET MVC应用程序。该应用程序的结构如下:
控制者
资料库
LINQ到实体(实体框架)
视图
我使用存储库(
_ProductRep
)查询LINQ to Entities,并将实际实体或List<T>
而不是IQueriables<T>
提供给Controller。
对于我毫无疑问的情况,我想提供一些帮助。我有以下代码:
List<Monthly_Report> lproduct_monthlyReport = _ProductRep.GetArchiveReport(product.Prod_ID, lmonth, lyear);
得到这个lproduct_monthlyReport
之后,我需要在foreach中查询它并获取特定记录。目前,我实现了这样的解决方案:
foreach (var item in litemList)
{
var lproductItem_monthlyReport = lproduct_monthlyReport.Single(m => m.Item_ID == item.Item_ID);
// Other code
}
其中“ 6”是产品可能具有的所有可能物品的列表。
我想知道这个解决方案是否合理地增加了耦合(并违反了Demeter的定律)还是可以接受的,因为我实际上是在查询List<T>
而不是IQueriable<T>
。如果我错了,请指正我,但是我猜想,由于List不需要访问EF DataContext,因此Controller和EF之间没有耦合。
万一我错了,我唯一能想到的解决方案就是用Repository方法(仍然要实现)替换查询:
var lproductItem_monthlyReport_ProductRep.GetArchiveReport(product.Prod_ID, lmonth, lyear, item.Item_ID);
但是,使用此解决方案时,存储库在每个循环周期使用4个条件进行一个查询,而在以前的解决方案中,存储库仅使用一个条件进行查询。
您能在这个问题上给我启发吗?谢谢。
PS:循环中需要变量lproduct_monthlyReport
和lproductItem_monthlyReport
,我不能只使用其中之一
PPS:我知道我应该在控制器和存储库之间有一个业务服务层,这是我的下一步。
没有找到相关结果
已邀请:
2 个回复
怪酞撩匹
它会比这更糟糕:
第一个将在没有WHERE子句的数据库中执行SELECT,然后为每个结果实例化.Net对象,然后查询该内存列表。在访问product1上的属性之前,第二个命令将不执行任何操作,并且此时将发出数据库命令以仅检索1个产品,并仅实例化该1个产品。 对于较小的数据集,两者之间的差异可能并不明显,但是随着数据集的增大,这将变得越来越糟。放入一个连接的实体(或更糟糕的是,还有实体集合),您将潜在地获得数千个数据库命中,如果您坚持使用IEnumerable,您将获得1。
闪脖