Criteria SpatialRestrictions.IsWithinDistance NHibernate.Spatial


95

Có ai đã thực hiện điều này, hoặc biết nếu nó sẽ khó khăn để thực hiện điều này / có bất kỳ hướng dẫn?

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

từ NHibernate.Spatial.Criterion.SpatialRestrictions

Tôi có thể sử dụng "where NHSP.Distance (PROPERTY,: point)" trong hql. Nhưng muốn kết hợp truy vấn này với truy vấn Tiêu chí hiện có của tôi.

hiện tại tôi đang tạo một đa giác thô và sử dụng

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

EDIT Có một nguyên mẫu hoạt động bằng cách nạp chồng hàm tạo trên SpatialRelationCriterion, thêm SpatialRelation mới.

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

đã thêm một trường mới vào SpatialRelationCriterion

private readonly double? distance;

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

Đã chỉnh sửa 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));
                }

quá tải ISpatialDialect.GetSpatialRelationString

thực hiện quá tải trong 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();
        }

Bạn không chắc tại sao AddParameter không được sử dụng?


3
Tôi gặp vấn đề tương tự và vẫn chưa tìm thấy bất kỳ bản vá / sửa chữa / bất kỳ thứ gì hoàn chỉnh nào cho đến nay. Bạn đã giải quyết được nó chưa hay bạn đã sử dụng biến thể HQL?
Liedman

1
Hãy suy nghĩ theo cách tiếp cận trên và dll được biên tập lại để hoạt động, nhưng vẫn là mã thử nghiệm.
Ian

2
@Amresh Bạn không hài lòng với giải pháp đề xuất mà OP đưa ra?
Eranga

Biên dịch lại DLL để nó hoạt động.
cowboy911,

Theo Rich Lander của Microsoft , bạn có thể có cơ hội tốt hơn nếu nêu vấn đề này trên diễn đàn NHibernate .
Annie

Câu trả lời:


1

chúng tôi đang xem xét vấn đề này tại GitHub. Cảm ơn bạn đã cung cấp thông tin chi tiết và giải pháp khả thi. Đây là liên kết đến vấn đề: https://github.com/nhibernate/NHibernate.Spatial/issues/61

Tôi sẽ xuất bản các gói NuGet mới ngay sau khi điều này được khắc phục.


Câu hỏi SO này quá về một vấn đề tương tự với một giải pháp khác nhau stackoverflow.com/questions/1833879/...
Surya Pratap

0

Có Tôi nghĩ rằng Biên dịch lại DLL là giải pháp tốt nhất cho bây giờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.