【问题标题】:Perform 'select * from (select * from ...)' query in ef core 2.2在 ef core 2.2 中执行“select * from (select * from ...)”查询
【发布时间】:2019-07-22 20:07:18
【问题描述】:

我正在尝试使用实体框架核心 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 核心警告或错误。是否有任何适当的方法来实现该查询?

【问题讨论】:

    标签: c# postgresql subquery postgis ef-core-2.2


    【解决方案1】:

    这样的东西会起作用吗?

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

    【讨论】:

      【解决方案2】:

      好的,也许有人知道更好的解决方案,但是经过一些研究,我无法使用 pure 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),
       .....
      

      所以现在我可以在没有groupbydistinct on 的情况下使用子选择orderby。 在没有任何 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", 
        .....
      

      【讨论】:

        猜你喜欢
        • 2021-06-26
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多