【发布时间】:2011-02-06 09:16:17
【问题描述】:
这个问题让我无法入睡,因为一年以来我一直在努力寻找解决方案,但是......我的脑海中仍然没有发生任何事情。也许你可以帮助我,因为我认为这是一个非常普遍的问题。
我有一个 n 层应用程序:表示层、业务逻辑层、模型层。为简单起见,假设我的应用程序在表示层中包含一个允许用户搜索客户的表单。现在用户通过 UI 填充过滤器并单击一个按钮。发生了一些事情,请求到达表示层,以CustomerSearch(CustomerFilter myFilter) 之类的方法。这个业务逻辑层现在保持简单:在模型上创建查询并返回结果。
现在的问题是:您如何面对加载数据的问题?我的意思是业务逻辑层不知道该特定方法将仅由该表单调用。所以我认为它不知道请求表单是否只需要返回 Customer 对象或带有链接 Order 实体的 Customer 对象。
我试图更好地解释: 我们的表格只想列出按姓氏搜索的客户。它与订单无关。所以业务逻辑查询会是这样的:
(from c in ctx.CustomerSet
where c.Name.Contains(strQry) select c).ToList();
现在它可以正常工作了。两天后,您的老板要求您添加一个表格,让您可以像其他人一样搜索客户,并且您需要显示每个客户创建的订单总数。现在我想重用该查询并添加附加(包含)订单的逻辑片段并取回它。
你会如何处理这个请求?
这是我从现在开始的最好的(我认为)想法。我想听听你的意见: 我在 BLL 中的 CustomerSearch 方法不会直接创建查询,而是通过组成 ObjectQuery 的私有扩展方法传递:
private ObjectQuery<Customer> SearchCustomers(this ObjectQuery<Customer> qry, CustomerFilter myFilter)
和
private ObjectQuery<Customer> IncludeOrders(this ObjectQuery<Customer> qry)
但这并不能说服我,因为它看起来太复杂了。
谢谢, 马可
【问题讨论】:
标签: entity-framework architecture lazy-loading eager-loading n-layer