这个问题是问以下两种方法中的哪一种更受鼓励(以及出于什么原因)?
我正在使用 C# 4.0 在 ServiceStack REST 应用程序中使用 FluentNHibernate,但这个问题对于 NHibernate LINQ 查询是普遍的。
是否更鼓励:
(方法 1)快速运行一个简单的查询,该查询返回与用户 ID 匹配的所有行:
// Query the User by id
var user = session.Get<User>(request.UserId);
然后在返回的 List 上分别使用 LINQ 进一步缩小结果范围:
// 'User' contains a 'List<Location>'
var locations = user.Locations.Where(location =>
location.Timestamp >= (request.MinTimestamp.HasValue ? request.MinTimestamp.Value : 0) &&
location.Timestamp <= (request.MaxTimestamp.HasValue ? request.MaxTimestamp.Value : DateTime.Now.ToTimestamp()));
return locations;
(方法 2)或者,是否更鼓励运行更复杂的查询,在单个查询中执行上述操作:
var locationsQuery = session.QueryOver<LocationModel>()
.Where(table => table.User.Id == request.UserId)
.And(table => table.Timestamp >= (request.MinTimestamp.HasValue ? request.MinTimestamp.Value : 0))
.And(table => table.Timestamp <= (request.MaxTimestamp.HasValue ? request.MaxTimestamp.Value : DateTime.Now.ToTimestamp()));
return locationsQuery.List();
如果我的目标是:
a) 更快的执行时间
基准(修订)
修订后的完整测试代码: http: //pastebin.com/0ykKwcxX
基准输出:
方法 1在5000 次迭代中花费了147.291 秒。
查询最后迭代的结果:
{时间戳= 1348659703485,纬度= 209.40000}
{时间戳= 1748659703486,Latitude = 179.55000,Vongitude = 209.55000}
{时间戳= 1348659703487,Latitude = 179.70000,Vongitude = 209.70000}
{时间戳= 1348659703488 , 纬度=179.85000, 经度=209.85000 }
{ 时间戳=1348659703489, 纬度=180.00000, 经度=210.00000 }
方法 2在5000 次迭代中花费了133.728 秒。
查询最后迭代的结果:
{时间戳= 1348659703485,纬度= 209.40000}
{时间戳= 1748659703486,Latitude = 179.55000,Vongitude = 209.55000}
{时间戳= 1348659703487,Latitude = 179.70000,Vongitude = 209.70000}
{时间戳= 1348659703488 , 纬度=179.85000, 经度=209.85000 }
{ 时间戳=1348659703489, 纬度=180.00000, 经度=210.00000 }
差异:方法 2 快了大约 13.5 秒。
b) 长期重复使用和稳定性