首页 > 解决方案 > 订购一个 3 级对象

问题描述

我有这个方案

Document
    DocumentId

Position
    PositionId
    DocumentId

Coordonate
    CoordonateId
    PositionId
    Km

Road
    RoadId
    CoordonateId
    Name

我需要按 Road.Name 排序文件,然后按最低 Coordonate.Km 排序。我试图在 SQL 和 EF 中订购它们,但没有运气,所以现在我使用这个非常慢的代码:

    foreach (var document in documents)
        foreach (var position in documentPositions)
        {
            if (!position.Coordonates.Any())
                continue;
            var minKm =
                position.Coordonates.OrderBy(a => a.Km).FirstOrDefault().Km.Value;

            dictionary.Add(document, minKm);
            break;
        }
    var sorted= dictionary.OrderBy(a => a.Key.RoadName).ThenBy(a => a.Value);

document.RoadName 是一个属性,它连接可能在文档中的所有 Road.Names。

LE:我在http://sqlfiddle.com/#!18/90b00/2/0做了一个 sqlfiddle希望对你有帮助

标签: c#sqlentity-framework

解决方案


Coordonates您可以按表编写子查询,使用rank带有windows函数的函数来获取samllestkm,然后执行join

select Documents.DocumentId,
       Documents.Name,
       Roads.Name,
       MIN(km) km
from Documents
INNER JOIN Positions ON Documents.DocumentId=Positions.DocumentId
INNER JOIN (
  select
      PositionId,
      CoordonateId,
      km,
      rank() over(partition by PositionId order by Km) rn
  from Coordonates 
) Coordonates ON Positions.PositionId=Coordonates.PositionId and rn =1 
INNER JOIN Roads ON Coordonates.CoordonateId=Roads.CoordonateId
group by Documents.DocumentId,
       Documents.Name,
       Roads.Name
Order By Roads.Name,km

[结果]

| DocumentId | Name | Name | km |
|------------|------|------|----|
|          2 | Doc2 |   A1 | 10 |
|          1 | Doc1 |   A2 | 10 |
|          3 | Doc3 |   A2 | 15 |

sqlfiddle


推荐阅读