我可以覆盖Entity Framework查询生成器吗?

bar*_*oma 8 c# gis entity-framework geospatial

实体框架上下文正在为我生成查询.

var query = from c in context.Cities where c.CityID == 3 select c;
var objectQuery=query as System.Data.Objects.ObjectQuery;
Console.WriteLine(objectQuery.ToTraceString());
Run Code Online (Sandbox Code Playgroud)

这将输出以下字符串:

SELECT
[Extent1].[CityID] AS [CityID],
[Extent1].[geom] AS [geom],
[Extent1].[Name] AS [Name],
FROM [dbo].[Cities] AS [Extent1]
WHERE 3 = [Extent1].[CityID]
Run Code Online (Sandbox Code Playgroud)

我的表包括名为geometry的空间​​列.实体框架不包含几何函数.例如,这是一个几何函数:

SELECT ST_AREA(geom) FROM Cities WHERE CityID = 3
Run Code Online (Sandbox Code Playgroud)

所以我不能像这样使用上下文扩展方法:

context.Cities.Where(....)
Run Code Online (Sandbox Code Playgroud)

是可能的,还是有任何实体框架方法来覆盖几何函数.

kri*_*gar 1

您不需要覆盖任何内容。最好的选择是通过实体框架执行简单的 SQL 查询并让它返回填充的对象。

// Add in whatever spatial stuff you need here.
var sql = "SELECT * FROM Cities WHERE CityId = {0} AND ...";

// Add whatever other parameters you need to the rest of the parameters.
var cities = context.Database.SqlQuery<City>(sql, cityId, ...);
Run Code Online (Sandbox Code Playgroud)

它不像使用 LINQ 那样“干净”,但我想他们还没有这样做的原因是实现打包到 EF 中的 LINQ to Entities 解决方案的后勤工作。您可以尝试这样做,但有一个更简单的解决方案。