1

次の 2 つのクラス定義があります。

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 IpRange
{
    public long Start { get; set; }
    public long End { 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();

しかし、クエリを実行すると、次のエラーが発生します。

Exception Details: System.InvalidCastException: Unable to cast object of type 'Jodolo.Data.Locations.Location' to type 'Jodolo.Data.Locations.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

. . .

最終的には、クエリ パラメータを満たす Location ドキュメントを取得しようとしているので、これを見て少し嬉しく思います。クエリ呼び出しの型宣言を次のように変更できることは明らかです

.Query<Location, Locations_ByRange>()

しかし、その後、インデックスに格納されたフィールドをクエリする方法を理解するのに苦労しました。Location オブジェクトには Start フィールドと End フィールドが定義されていないためです。

これについての助けをいただければ幸いです。

4

1 に答える 1

1

クエリを次のように変更します。

using Raven.Client;

...

var location = session.Query<IpRange, Locations_ByRange>()
                      .Where(x => x.Start <= reverseIp && x.End >= reverseIp)
                      .As<Location>()
                      .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);
    }
}

の上部に戻り値の型を追加したことに注意してくださいAbstractIndexCreationTask<Location, IpRange>。これにより、Sortメソッドがそれらのプロパティを見つけることができるように、型が整列されます。

于 2013-08-21T14:01:39.213 に答える