c# - 订购一个 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希望对你有帮助
解决方案
Coordonates
您可以按表编写子查询,使用rank
带有windows函数的函数来获取samllest
km,然后执行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 |
推荐阅读
- .net - 如果未达到阈值,C# Msbuild 代码覆盖率硬停止
- android - 如何使一半的 imageView 透明?
- python - 熊猫合并和抱怨
- linux - 无法在 CentOS 7 上安装 PostgreSQL 9.5/PostGIS 2.3
- java - 在春季框架中选择枚举
- ajax - 将新添加的数据从数据库更新到gridview,无需重新加载和ajax
- c# - 如何创建一个基本的包来存储图像?
- intellij-idea - 如何以编程方式为 Intellij Idea 创建自定义 Kotlin 检查
- karate - 空手道数组字段成为对象
- javascript - Angular 5 HttpInterceptor 请求前刷新令牌