LINQ to Entity不支持DbGeography条件。

5
我正在使用.NET 4.5和EF 6.0(也尝试过6.1.3)。 我在实体表中有一个位置地理列(System.Data.Entity.Spatial.DbGeography)。
using System.Data.Spatial; //also tried Entity one

public class Entity
{
    public DbGeography Location {get;set;}
}

在LINQ中,我正在尝试选择所有位于指定区域内的实体。

var center = DbGeography.FromText(string.Format("POINT({0} {1})", latitude, longitude), 4326);
var region = center.Buffer(radius);
var result = db.Entities.Where(x => SqlSpatialFunctions.Filter(x.Location, region) == true).ToArray();

这个查询返回了一个错误:

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll

Additional information: The specified type member 'Location' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

如果这是真的:
http://referencesource.microsoft.com/#System.Data.Entity/System/Data/Objects/SqlClient/SqlSpatialFunctions.cs

这在网上的示例中是如何工作的?

更新。使用Intersects()时出现相同的问题。

var center = DbGeography.FromText(string.Format("POINT({0} {1})", latitude, longitude), 4326);
var region = center.Buffer(radius);
var result = db.Entities.Where(x => x.Location.Intersects(region) == true).ToArray();
3个回答

0
在我的情况下,我的Linq查询不允许我使用:
x.Intersects(region) == true

我不得不将这个改成

x.Intersects(region).IsTrue

0

如果您正在使用DB First方法,则需要从模型浏览器中更新模型,而不是手动更新。


0

使用STIntersects()或STWithin()及其EF等效函数,您很可能会获得相同甚至更好的性能;

// SQL STIntersects() equivalent    
var result = db.Entities.Where(x => x.Intersects(region)).ToArray();

// SQL STWithin() equivalent    
var result = db.Entities.Where(x => x.Intersects(region) == true && x.Difference(region).IsEmpty == true).ToArray();

如果您想要所有完全或部分位于该区域的位置,请使用“Intersects”。如果您只想要完全位于该区域内的位置,请使用“Within”。


更新的帖子。Intersects() 抛出相同的异常。 - dr11
@deeptowncitizen - 多么奇怪!你正在使用EF6吗?你是如何映射表的? - Jon Bellamy
是的,那就是EF6。我有一个带有Lng、Lat字段的表。我添加了类型为Geography的Location,并将这个新列映射到实体DbGeography上。顺便说一句,SQL请求工作得很好。 - dr11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接