Kriterien SpatialRestrictions.IsWithinDistance NHibernate.Spatial

95

Hat jemand dies implementiert oder weiß er, ob es schwierig wäre, dies zu implementieren / hat er irgendwelche Hinweise?

public static SpatialRelationCriterion IsWithinDistance(string propertyName, object anotherGeometry, double distance)
{
    // TODO: Implement
    throw new NotImplementedException();
}

von NHibernate.Spatial.Criterion.SpatialRestrictions

Ich kann "where NHSP.Distance (PROPERTY ,: point)" in hql verwenden. Sie möchten diese Abfrage jedoch mit meiner vorhandenen Kriterienabfrage kombinieren.

Im Moment erstelle ich ein grobes Polygon und benutze

criteria.Add(SpatialRestrictions.Intersects("PROPERTY", myPolygon));

BEARBEITEN Ein Prototyp wurde erstellt, indem der Konstruktor auf SpatialRelationCriterion überladen und eine neue SpatialRelation.Distance hinzugefügt wurde

public static SpatialRelationCriterion IsWithinDistance(string propertyName, object anotherGeometry, double distance)
        {
            return new SpatialRelationCriterion(propertyName, SpatialRelation.Distance, anotherGeometry, distance);
        }

hat SpatialRelationCriterion ein neues Feld hinzugefügt

private readonly double? distance;

public SpatialRelationCriterion(string propertyName, SpatialRelation relation, object anotherGeometry, double distance)
            : this(propertyName, relation, anotherGeometry)
        {
            this.distance = distance;
        }

ToSqlString bearbeitet

object secondGeometry = Parameter.Placeholder;
                if (!(this.anotherGeometry is IGeometry))
                {
                    secondGeometry = columns2[i];
                }

                if (distance.HasValue)
                {
                    builder.Add(spatialDialect.GetSpatialRelationString(columns1[i], this.relation, secondGeometry, distance.Value, true));
                }
                else
                {
                    builder.Add(spatialDialect.GetSpatialRelationString(columns1[i], this.relation, secondGeometry, true));
                }

überladen ISpatialDialect.GetSpatialRelationString

Überladung in MsSql2008SpatialDialect implementiert

public SqlString GetSpatialRelationString(object geometry, SpatialRelation relation, object anotherGeometry, double distance, bool criterion)
        {
            var x = new SqlStringBuilder(8)
                           .AddObject(geometry)
                           .Add(".ST")
                           .Add(relation.ToString())
                           .Add("(")
                           .AddObject(anotherGeometry)
                           .Add(")");

            if (criterion)
            {
                x.Add(" < ");
                x.AddObject(distance.ToString());
            }

            return x.ToSqlString();
        }

Sie sind sich nicht sicher, warum AddParameter nicht verwendet wird?

Ian
quelle
3
Ich habe das gleiche Problem und habe bisher noch keinen vollständigen Patch / Fix / was auch immer gefunden. Haben Sie es gelöst oder haben Sie sich für die HQL-Variante entschieden?
Liedman
1
Think ging mit dem obigen Ansatz und kompilierte die DLL neu, um zu funktionieren, war aber immer noch experimenteller Code.
Ian
2
@Amresh sind Sie nicht zufrieden mit der vorgeschlagenen Lösung, die OP gegeben hat?
Eranga
Kompilieren Sie die DLL neu, damit sie funktioniert.
Cowboy911
Laut Rich Lander von Microsoft haben Sie möglicherweise eine bessere Chance, wenn Sie dieses Problem in NHibernate-Foren ansprechen .
Annie

Antworten:

0

Ja, ich denke, dass das Neukompilieren der DLL die derzeit beste Lösung ist.

ilce
quelle