为什么F#中的orderBy不会在SQL中生成ORDER BY语句?

3

我目前正在开发一个使用美国县级数据的小项目。我没有问题对数据进行 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 Server实例时,在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中获得排序数据? 我的目标是尽可能简洁地展示给我的雇主作为一个小例子。
提前感谢!

您的SQL查询中没有order by,因此结果将是无序的。 - Pரதீப்
@NoDisplayName 是的,我理解。我会更新我的问题以反映这种不确定性。然而,问题是,我期望在SQL查询中有一个ORDER BY,因为它是由查询表达式自动生成的。 - Duncan Hill
1
可能与使用Distinct有关。你试过不用它吗?Distinct不必保留顺序,而F#中元素的顺序似乎很重要。 - jessehouwing
@jessehouwing 那个确实可以工作。还有一种方法可以利用 distinct 吗?或者在表达式结束后使用 |> Seq.distinct 是更好的选择? - Duncan Hill
1
你可以将它编写成这样吗:for c in db.CountyMatrix do let c = { State = c.State; SSA = c.Countyssa } distinct sortBy c.SSA select c?我的F#水平不足,不知道是否正确… - jessehouwing
1
@jessehouwing,那绝对有效,您能否将其作为答案并解释一下发生了什么?我很想奖励您一些网络积分,哈! - Duncan Hill
3个回答

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

请参阅 此处的每个关键词的说明

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

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


这不是匿名类型,而是County记录的实例。F#不支持匿名类型。 - Joel Mueller
那是我将 C# 翻译成 F# 的错误 :)。我告诉过你,我的 F# 最多只能算生疏。 - jessehouwing

0
今天遇到了这个问题。这里是使用子查询的一种替代方案:
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
    }

-1

尝试将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
    }

不幸的是,这会导致编译时错误。我认为这只是答案中语句顺序的问题。 - Duncan Hill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接