【发布时间】:2010-06-23 22:15:28
【问题描述】:
我曾在 much more long-winded way a few days ago 中提出过这个问题,考虑到篇幅,我没有得到答案这一事实并不令人惊讶,所以我想我会更深入地了解这一点。
我必须根据分配给特定客户的用户来决定向用户显示什么。域对象看起来像这个大大简化的示例:
public class Customer
{
public string Name { get; set; }
public IEnumerable<Users> AssignedUsers { get; set; }
}
在现实世界中,我还将评估他们是否有权限(使用安全标志上的按位比较)来查看该特定客户,即使他们没有直接分配给它。
我在这里尝试坚持domain-driven design (DDD) 原则。此外,我使用 LINQ to SQL 进行数据访问。在我的服务层中,我为请求客户列表的用户提供服务,现在大约有 1000 个项目,并且每月增长约 2%。
如果我严格要求在服务层中保留逻辑,我将需要使用 Linq 执行 .Where 评估 AssignedUsers 列表是否包含请求列表的用户。这将导致系统枚举时对每个Customer 进行级联查询。我没有做任何测试,但这似乎效率低下。
如果我对 no-logic-in-the-data 进行忽悠,那么我可以简单地使用 GetCustomersByUser() 方法来执行 EXISTS 类型的 SQL 查询并同时评估安全性。这肯定会更快,但现在我说的是潜入数据库的逻辑,这可能会在以后产生问题。
我敢肯定,这是人们在推出 Linq 时会遇到的一个常见问题......关于哪种方式更好的建议? Linq 的多个查询对性能的影响是否比我的数据库中的逻辑更好?
【问题讨论】:
-
如果您主要尝试检索分配给用户的客户,您是否应该不修改您的对象,并拥有一个包含已分配客户列表的用户?
-
实际上伴随着用户分配的数据——例如他们收到的佣金。结果,无论您以哪种方式看待它,多对多关系都将需要单独的分配对象。我们也是批发的,所以用户是我们真正的客户。
-
我正在考虑更多关于该评论...实际上可能有一种方法可以翻转它并使 Assignment 对象及其数据专注于客户而不是用户...
标签: c# performance linq-to-sql domain-driven-design