为什么 F# 中的 orderBy 不会导致 SQL 中的 ORDER BY?

Why does orderBy in F# not result in an ORDER BY in SQL?

我目前正在做一个使用美国县数据的小项目。我对 Seq.orderBy 中的数据排序没有问题,但由于查询表达式中有 sortBy,我希望对结果进行排序。事实并非如此。

type SysData = SqlDataConnection<"Data Source=ROME\SQLEXPRESS;Initial Catalog=SysData;Integrated Security=True">
type County = { State : string; SSA : string }

let counties =
    let db = SysData.GetDataContext()
    query {
        for c in db.CountyMatrix do
        sortBy c.Countyssa
        select { State = c.State; SSA = c.Countyssa }
        distinct
    }

现在,上面是我正在执行的,但我的结果最终看起来是这样的:

...
{State = "OR";
 SSA = "38030";}
{State = "GA";
 SSA = "11630";}
{State = "WA";
 SSA = "50130";}
{State = "MN";
 SSA = "24740";}
{State = "KY";
 SSA = "18030";}
{State = "MO";
 SSA = "26970";}
{State = "DC";
 SSA = "09000";}
...

发送到我本地 SQL 服务器实例的查询在 IntelliTrace 中显示如下:

USE [SysData];

GO

SELECT DISTINCT [t0].[state] AS [Item1], [t0].[countyssa] AS [Item2]
FROM [dbo].[CountyMatrix] AS [t0]

请注意缺少 ORDER BY,因为查询表达式的 sortBy c.Countyssa

关于为什么我没有从 counties 中获取排序数据的任何想法?我的目标是让这个尽可能干净,作为一个小例子展示给我的雇主。

提前致谢!

尝试将 sortBy 表达式放在 select 之后。

let counties =
    let db = SysData.GetDataContext()
    query {
        for c in db.CountyMatrix do
        select { State = c.State; SSA = c.Countyssa }
        sortBy c.Countyssa
        distinct
    }

关键字的顺序很重要。如果您仔细阅读了说明,那么 SortBy 将对到目前为止已选择的元素进行排序。到目前为止,Distinct 将删除重复项(但其中没有关于保持顺序的任何内容)等。这些关键字中的每一个都作用于它之前的关键字,但请记住,它也可能撤消之前所做的事情(如排序) .

参见description of each of these keywords here

for c in db.CountyMatrix do 
    let c = { State = c.State; SSA = c.Countyssa } 
    distinct 
    sortBy c.SSA 
    select c

您可能需要使用临时变量来捕获数据类型,以便区分和排序它们。

今天遇到这个。这是使用子查询的替代解决方案:

let counties =
    let db = SysData.GetDataContext()
    query {
        for result in (query {
            for c in db.CountyMatrix do
            select { State = c.State; SSA = c.Countyssa }
            distinct
        }) do
        sortBy (result.SSA)
        select result
    }