0

我是 SubSonic 和 Linq Stuff 的新手,我正在尝试找出检索单个记录的最短和最佳方法。

还有什么其他方法比这更快并且需要更少的代码来获得一条记录?

User user2 = DB.Select().From(User.Schema)
.Where(User.PasswordColumn).IsEqualTo(password)
.And(User.SINumberColumn).IsEqualTo(siNumber)
.ExecuteSingle<User>();

我已经使用 AntsProfiler 工具进行检查,这需要平均 29.12 毫秒的 CPU 时间——经过十次运行测试

因为这需要更长的时间

UserController uc = new UserController();
Query query = new Query("User");
query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);   
User user = uc.FetchByQuery(query).First<User>();

仅最后一行需要 256.08 毫秒 CPU 时间加上 UserController 需要 66.86 毫秒。

有什么建议么?

4

3 回答 3

2

“瓶颈”将是生成的查询执行,而不是 SubSonic 生成它或返回结果。如果一个特定的查询很慢,你应该考虑使用你的数据库提供者的索引功能来优化它。

在第二种情况下,我假设额外的执行时间是 LINQ 从集合中返回第一项的开销。

所以我的回答是,第一种方法是最好的方法,如果 29 毫秒是不可接受的(对于调用数据库,我认为这不是不合理的),在你的数据库中添加一些索引以加快速度向上检索。

于 2009-05-04T03:43:48.723 回答
1

IIRC,查询对象是流利的..即

query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);

应该读作:

query = query.WHERE(User.Columns.Password, password);
query = query.WHERE(User.Columns.SINumber, siNumber);

测试中增加的时间可能是因为这个原因(你要求所有用户项目,然后抓住第一个)。

于 2009-05-04T14:04:27.937 回答
0

我认为约翰在金钱上是对的。如果您真的想测试 SubSonic 以查看需要多长时间,您需要测试 subsonic 创建 SQL 语句需要多长时间,而不是 SubSonic 创建 SQL 语句需要多长时间以及 DB 返回结果需要多长时间同时(你需要隔离你的测试)。

也许您应该测试使用常规旧 SQLCommand 获得结果需要多长时间,并将您的连接和参数传递给它,然后查看需要多长时间以便进行比较。

于 2009-05-04T13:50:47.937 回答