Gui*_*oli 8 c# sql-server entity-framework entity-framework-core
我需要处理地理距离.
我有
public class Clinic
{
...
public double Latitude
public double Longitud
...
}
Run Code Online (Sandbox Code Playgroud)
该诊所位于SQL Server DB上.我需要将它们按距离排列到某一点.对于我读到的内容,Entity Framework Core不支持DbGeography或类似于表示SQL Server类型的东西:
geography
Run Code Online (Sandbox Code Playgroud)
我在数据库中添加了一个列,其中包含每个诊所的计算地理点
UPDATE Clinics SET Geo = geography::Point(Clinics.Latitude, Clinics.Longitud,4326)
Run Code Online (Sandbox Code Playgroud)
好的,知道我需要退回订购.SQL通过查询支持此功能
DECLARE @p geography;
SET @p = geography::Point(41,2,4326);
SELECT * FROM Clinics c ORDER BY @p.STDistance(c.Geo);
Run Code Online (Sandbox Code Playgroud)
和Entity Framework Core支持使用原始SQL进行查询.
context.Clinics.FromSql("..query..")
Run Code Online (Sandbox Code Playgroud)
正如FromSql的文档所说,如果您返回的数据与模型不完全匹配,那么它就会崩溃.就像在C#中我不能有代表Geo的DbGeography我无法弄清楚如何解决这个问题.
编辑1:
部分使用以下内容:
string rawSQL = @"
DECLARE @p geography;
SET @p = geography::Point(41,2,4326);
SELECT c.Id, c.Name, c.Price, c.Quote, c.QuoteAuthor, c.QuoteSource, c.Description, c.Image, c.Latitude, c.Longitude, c.Category, c.CenterDistance, c.NumReviews, c.Stars
FROM Clinics c
ORDER BY @p.STDistance(c.Geo); ";
query = query.FromSql(rawSQL);
Run Code Online (Sandbox Code Playgroud)
所以现在我得到了诊所的所有属性,它的确有效!事实是,诊所有相关的课程设施
public class Clinic
{
...
public double Latitude
public double Longitud
public Amenity amenity
...
}
Run Code Online (Sandbox Code Playgroud)
因此,当我运行查询时,我需要包含linq的设施
query = query.Include(c => c.ClinicAmenities).ThenInclude(ca => ca.Amenity);
Run Code Online (Sandbox Code Playgroud)
死,因为来自原始sql的Orderby在我相信包含之前
您没有指定您收到的错误。
在我看来,您会收到错误“调用存储过程时不支持包含操作”。
您可以做的是执行两个查询。
像这样的东西
dbContext.Amenities.Load();
string rawSQL = @"
DECLARE @p geography;
SET @p = geography::Point(41,2,4326);
SELECT c.Id, c.Name, c.Price, c.Quote, c.QuoteAuthor
FROM Clinics c
ORDER BY @p.STDistance(c.Geo)";
// EF will automatically wire up the references between entities
// that have been queried for
var clinicsWithAmenities = dbContext.Clinics.FromSql(rawSQL).ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1061 次 |
| 最近记录: |