2012-08-30 180 views
1

我得到0结果与以下,我不认为应该是这种情况。RavenDB空间查询不返回结果

查询代码:

var sourceResults = session.Advanced.LuceneQuery<Route>("Routes/BySource") 
      .WithinRadiusOf(5, toMatch.Source.Location.Latitude, toMatch.Source.Location.Longitude) 
      .WhereBetween(r => r.DateTime, minDateTime, maxDateTime).ToArray(); 

指数代码:

/// <summary> 
    /// Index for spatial search by route source. 
    /// </summary> 
    public class Routes_BySource : AbstractIndexCreationTask<Route> 
    { 
     public Routes_BySource() 
     { 
      Map = routes => from r in routes 
          select new { _ = SpatialIndex.Generate(r.Source.Location.Latitude, r.Source.Location.Longitude) }; 
     } 
    } 

型号:

public class Route 
{  
    /// <summary> 
    /// Gets or sets the id. 
    /// </summary> 
    /// <value> 
    /// The id. 
    /// </value>   
    public string Id { get; set; } 

    /// <summary> 
    /// Gets or sets the source. 
    /// </summary> 
    /// <value> 
    /// From. 
    /// </value> 
    public Address Source { get; set; } 

    /// <summary> 
    /// Gets or sets destination. 
    /// </summary> 
    /// <value> 
    /// To. 
    /// </value> 
    public Address Destination { get; set; } 

    /// <summary> 
    /// Gets or sets the id of the user who requested the route. 
    /// </summary> 
    /// <value> 
    /// The user id. 
    /// </value> 
    public string UserId { get; set; } 

    /// <summary> 
    /// Gets or sets the date time that the request is for. 
    /// </summary> 
    /// <value> 
    /// The date time. 
    /// </value> 
    public DateTime DateTime { get; set; } 
} 

public class Address 
{ 
    /// <summary> 
    /// Gets or sets the name. This is the formatted full name of the address. 
    /// </summary> 
    /// <value> 
    /// The name. 
    /// </value> 
    public string Name { get; set; } 

    /// <summary> 
    /// Gets or sets the location. 
    /// </summary> 
    /// <value> 
    /// The location. 
    /// </value> 
    public Location Location { get; set; } 
} 

public class Location 
{ 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 
} 

单元测试(调用查询代码)

 using (var session = Common.DocumentStore.OpenSession()) 
     { 
      var routeService = new RouteService(session); 
      var newRoute = new Route 
      { 
       Id = Guid.NewGuid().ToString(), 
       DateTime = DateTime.Now, 
       UserId = "user", 
       Source = new Address { Name = "101 W. 79th St. NY, NY", Location = new Location { Latitude = 32, Longitude = 72 } }, 
       Destination = new Address { Name = "101 W. 79th St. NY, NY", Location = new Location { Latitude = 32, Longitude = 72 } } 
      }; 
      routeService.Save(newRoute); 
      var routes = routeService.Search(newRoute); 
      Assert.IsTrue(routes.Any()); 
     } 

任何想法我在这里做错了吗?似乎应该是相当简单的......

感谢

+0

您传递给WithinRadiusOf的值是什么? –

+0

单元测试经纬度中提到的那些 – Jeff

+0

为了测试的目的,我正在搜索我刚刚保存的相同值 – Jeff

回答

3

在你的代码有routeService.Save(newRoute);,我已经习惯了看到session.Store(newRoute);然后session.SaveChanges();

在调用session.SaveChanges();函数之前,事物并没有被写入数据库。

但是你需要给ravenDB时间索引更改。我建议使用“等待非陈旧的结果”,我不记得现在的代码,但如果你谷歌ravendb非陈旧的结果。

+0

你赢了!谢谢!添加session.Query ().Customize(x => x.WaitForNonStaleResults())。ToArray(); – Jeff