Indexing ravendb查询位置业务索引
我有以下两个类定义:Indexing ravendb查询位置业务索引,indexing,ravendb,querying,Indexing,Ravendb,Querying,我有以下两个类定义: public class Location : Doc { public string Country { get; set; } public string Region { get; set; } public string City { get; set; } public string PostalCode { get; set; } public Double Latitude { get; set; } publi
public class Location : Doc
{
public string Country { get; set; }
public string Region { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
public Double Latitude { get; set; }
public Double Longitude { get; set; }
public string MetroCode { get; set; }
public string AreaCode { get; set; }
public List<IpRange> IpRanges { get; set; }
}
我的索引定义如下:
public class Locations_ByRange : AbstractIndexCreationTask<Location>
{
public Locations_ByRange()
{
Map = locations =>
from location in locations
from range in location.IpRanges
select new
{
range.Start,
range.End
};
}
}
var queryable = DocumentSession.Query<IpRange, Locations_ByRange>()
.FirstOrDefault(x => x.Start <= reverseIp && x.End >= reverseIp) ?? new IpRange();
下面是StackTrace:
[InvalidCastException: Unable to cast object of type 'Jodolo.Data.Locations.Location' to type 'Jodolo.Data.Locations.IpRange'.]
Raven.Client.Document.InMemoryDocumentSessionOperations.TrackEntity(String key, RavenJObject document, RavenJObject metadata, Boolean noTracking) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\InMemoryDocumentSessionOperations.cs:357
Raven.Client.Document.SessionOperations.QueryOperation.Deserialize(RavenJObject result) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\SessionOperations\QueryOperation.cs:167
System.Linq.WhereSelectListIterator`2.MoveNext() +104
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381
System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
Raven.Client.Document.SessionOperations.QueryOperation.Complete() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\SessionOperations\QueryOperation.cs:143
Raven.Client.Document.AbstractDocumentQuery`2.GetEnumerator() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\AbstractDocumentQuery.cs:891
System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +152
Raven.Client.Linq.RavenQueryProviderProcessor`1.GetQueryResult(IDocumentQuery`1 finalQuery) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProviderProcessor.cs:1529
Raven.Client.Linq.RavenQueryProviderProcessor`1.ExecuteQuery() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProviderProcessor.cs:1454
Raven.Client.Linq.RavenQueryProviderProcessor`1.Execute(Expression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProviderProcessor.cs:1427
Raven.Client.Linq.RavenQueryProvider`1.Execute(Expression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProvider.cs:155
Raven.Client.Linq.RavenQueryProvider`1.System.Linq.IQueryProvider.Execute(Expression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProvider.cs:198
System.Linq.Queryable.FirstOrDefault(IQueryable`1 source, Expression`1 predicate) +287
。
.
看到这一点我有点高兴,因为我最终尝试检索满足查询参数的位置文档。很明显,我可以将查询调用上的类型声明更改为
.Query<Location, Locations_ByRange>()
.Query()
但是,我很难弄清楚如何查询存储在索引中的字段;因为没有为位置对象定义开始和结束字段
非常感谢您的帮助。将您的查询更改为:
using Raven.Client;
...
var location = session.Query<IpRange, Locations_ByRange>()
.Where(x => x.Start <= reverseIp && x.End >= reverseIp)
.As<Location>()
.FirstOrDefault();
使用Raven.Client;
...
var location=session.Query()
.Where(x=>x.Start=reverseIp)
.As()
.FirstOrDefault();
在索引中,您可能需要添加排序提示:
public class Locations_ByRange : AbstractIndexCreationTask<Location, IpRange>
{
public Locations_ByRange()
{
Map = locations =>
from location in locations
from range in location.IpRanges
select new
{
range.Start,
range.End
};
Sort(x => x.Start, SortOptions.Long);
Sort(x => x.End, SortOptions.Long);
}
}
公共类位置\u ByRange:AbstractIndexCreationTask
{
公共场所
{
地图=位置=>
从地点到地点
从location.IpRanges中的范围
选择新的
{
射程,开始,
射程,结束
};
排序(x=>x.Start,SortOptions.Long);
排序(x=>x.End,SortOptions.Long);
}
}
注意,我在AbstractIndexCreationTask
的顶部添加了返回类型。这将对齐类型,以便排序方法可以定位这些属性。将查询更改为:
using Raven.Client;
...
var location = session.Query<IpRange, Locations_ByRange>()
.Where(x => x.Start <= reverseIp && x.End >= reverseIp)
.As<Location>()
.FirstOrDefault();
使用Raven.Client;
...
var location=session.Query()
.Where(x=>x.Start=reverseIp)
.As()
.FirstOrDefault();
在索引中,您可能需要添加排序提示:
public class Locations_ByRange : AbstractIndexCreationTask<Location, IpRange>
{
public Locations_ByRange()
{
Map = locations =>
from location in locations
from range in location.IpRanges
select new
{
range.Start,
range.End
};
Sort(x => x.Start, SortOptions.Long);
Sort(x => x.End, SortOptions.Long);
}
}
公共类位置\u ByRange:AbstractIndexCreationTask
{
公共场所
{
地图=位置=>
从地点到地点
从location.IpRanges中的范围
选择新的
{
射程,开始,
射程,结束
};
排序(x=>x.Start,SortOptions.Long);
排序(x=>x.End,SortOptions.Long);
}
}
注意,我在
AbstractIndexCreationTask
的顶部添加了返回类型。这将对齐类型,以便Sort
方法可以定位这些属性。如果我只是按照您指定的方式更改查询,则无法生成。是否需要向类中添加using语句?请参阅我更新的答案,了解如何修改索引以添加排序提示。如果没有它们,这些字段可能会使用字符串排序进行排序,并抛出范围查询。如果您使用的是RavenDB 2.5,则可以尝试使用新功能ResultsTransformers
。api有点干净。你可以在我找到的文档中找到一些例子。As方法是驻留在Raven.Client命名空间中的LinqExtensions类中的扩展方法。我刚把Raven.Client.Linq改成Raven.Client,一切都很好。谢谢你的帮助,马特,我的错。你说得对。但一定要注意排序顺序。:)如果只是按照您指定的方式更改查询,则无法生成。是否需要向类中添加using语句?请参阅我更新的答案,了解如何修改索引以添加排序提示。如果没有它们,这些字段可能会使用字符串排序进行排序,并抛出范围查询。如果您使用的是RavenDB 2.5,则可以尝试使用新功能ResultsTransformers
。api有点干净。你可以在我找到的文档中找到一些例子。As方法是驻留在Raven.Client命名空间中的LinqExtensions类中的扩展方法。我刚把Raven.Client.Linq改成Raven.Client,一切都很好。谢谢你的帮助,马特,我的错。你说得对。但一定要注意排序顺序。:)