2010-03-11 3 views
94

Hat jemand dies implementiert oder weiß, ob es schwierig wäre, dies zu implementieren/irgendwelche Zeiger zu haben?Kriterien SpatialRestrictions.IsWithinDistance NHibernate.Spatial

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

von NHibernate.Spatial.Criterion.SpatialRestrictions

kann ich "wo NHSP.Distance (SACH: Punkt)" in hql. Ich möchte diese Abfrage jedoch mit meiner vorhandenen Criteria-Abfrage kombinieren.

für den Moment eine grobe Polygon Ich erstelle und

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

EDIT einen Prototyp arbeitet Got Konstruktor auf SpatialRelationCriterion durch Überlastung, neue SpatialRelation.Distance Zugabe

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

ein neues Feld zu SpatialRelationCriterion hinzugefügt

private readonly double? distance; 

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

Edited ToSqlString

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)); 
       } 

überlastet ISpatialDialect.GetSpatialRelationString

implementiert Überlastung in MsSql2008SpatialDialect

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(); 
     } 

nicht sicher, warum AddParameter nicht verwendet?

+3

Ich habe das gleiche Problem, und habe bis jetzt keinen vollständigen Patch/Reparatur/was auch immer gefunden. Hast du es gelöst, oder hast du die HQL Variante gewählt? – Liedman

+1

Think ging mit dem obigen Ansatz, und rekompilierte DLL, um zu arbeiten, war aber immer noch experimentellen Code. – Ian

+2

@ Amresh sind Sie nicht zufrieden mit der vorgeschlagenen Lösung OP gab? – Eranga

Antwort

1

Ja, ich denke, dass die DLL die beste Lösung für jetzt neu kompilieren.

0

wir prüfen diese Ausgabe bei GitHub. Danke, dass Sie großartige Einblicke und eine mögliche Lösung erhalten. Hier ist ein Link zu dem Problem: https://github.com/nhibernate/NHibernate.Spatial/issues/61

Ich werde neue NuGet-Pakete veröffentlichen, sobald dies behoben ist.

+0

diese Frage ist auch über ein ähnliches Problem mit einer anderen Lösung http://stackoverflow.com/questions/1833879/advanced-search-with-distances-using-nhibernate-and-sql-server-geography –