返回计数比返回对象更好/更快吗?堆栈溢出!

时间:2010-12-29 14:43:45

标签: c# entity-framework-4

我正在EF4中创建一个存储库。对于其中一种方法,使用密码和用户名来验证用户。该方法返回用户数,因此0表示它们不存在,1表示它们不存在。如果我刚刚返回一个用户对象并将其检查为null,那会有很大的不同吗?

5 个答案:

答案 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以验证是否存在)是一个更多我认为有效的策略。