我正在EF4中创建一个存储库。对于其中一种方法,使用密码和用户名来验证用户。该方法返回用户数,因此0表示它们不存在,1表示它们不存在。如果我刚刚返回一个用户对象并将其检查为null,那会有很大的不同吗?
答案 0 :(得分:1)
从技术上讲,最有效的方法可能是使用Any()
扩展方法。如果返回一个对象,则需要填充该对象的成本。如果你返回一个计数,则需要花费每个记录(在应用了where子句之后)并计算它们的成本。 Any()
应该在sql中使用Exists
,因此,SQL Server可以在找到第一条记录后立即停止。
最终,我同意其他人的意见,这不是一个你想立即开始优化的地方。 Donald Knuth可能对此有最好的引用: “我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。”
例如,假设您使用此方法返回bool并使用Any()
方法。在请求的后面,您可能需要将用户对象拉出数据库(这可能是您最终做了很多事情)。现在,通过早期优化,您实际上增加了对数据库的调用次数。
HTH
答案 1 :(得分:1)
与Any的选项会更好,因为EF对物体的物化和更改跟踪成本很高,如果该物体碰巧有很多属性,那么你一定要考虑使用Any。
答案 2 :(得分:0)
第二个版本会更好 - 在设计方面。就微观效率而言,无关紧要
答案 3 :(得分:0)
我同意Armen,返回对象并检查null。很简单,很容易理解发生了什么。
答案 4 :(得分:0)
如果在验证存在有效的用户/密码组合后不需要“用户”表中的任何数据,那么任何一种方法都可以工作(并且性能无关紧要)。
另一方面,如果您确认有效的用户名/密码,那么您打算再次调用以获取用户详细信息,那么首先清楚地返回该对象(并检查null以验证是否存在)是一个更多我认为有效的策略。