0

我正在尝试使用实体框架核心 2.2 在 c# 中使用对此(SQL)的子查询执行类似的查询

select ST_LengthSpheroid(ST_MakeLine(a."Location"),'SPHEROID["WGS 84",6378137,298.257223563]') AS Length
from (select * from "Logs" where "CarId" = 191
      order by "Id") as a;

在实体框架 > 2.0 中,我尝试执行左连接,但使用自定义函数时,我遇到了 ef 核心警告或错误。是否有任何适当的方法来实现该查询?

4

2 回答 2

0

像这样的东西会起作用吗?

select ST_LengthSpheroid(ST_MakeLine(TrackerLogs.Location),'SPHEROID["WGS 84",6378137,298.257223563]') AS Length
from TrackerLogs
where CarId = 191
order by Id
于 2019-02-28T20:33:47.033 回答
0

好的,也许有人知道更好的解决方案,但是经过一些研究,我无法使用ef 核心来实现,所以我使用了FromSql

var queryable = qLogs.FromSql("select * from \"" + tableName + "\" order by \"" + orderField + "\"");

var result = qCars.Select(x => new RouteModel
{
   Mileage = Math.Round(
       queryable
           .Where(y => y.CarId == x.Id)
           .Select(y => PostgisExtensions.ST_LengthSpheroid(
                    PostgisExtensions.ST_MakeLine(
                        PostgisExtensions.ST_GeomFromText(y.Location.AsText(),          PostgisConstants.MetricSrid)
                    ),
                   PostgisConstants.SpheroidWgs84)
           )
           .FirstOrDefault() / 1000),
 .....

所以现在我可以orderby在没有groupbyor的情况下使用子选择distinct on。在没有任何 ef 核心警告的情况下完美运行并生成预期的查询:

  SELECT ROUND(COALESCE((
      SELECT ST_LengthSpheroid(ST_MakeLine(ST_GeomFromText(ST_AsText(x0."Location"), 4326)), 'SPHEROID["WGS 84",6378137,298.257223563]')
      FROM (
          select * from "Logs" order by "FixedAt"
      ) AS x0
      WHERE (x0."CarId" = x."Id")
      LIMIT 1
  ), 0.0) / 1000.0) AS "Mileage", 
  .....
于 2019-03-01T15:18:24.107 回答