为什么 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
}
我目前正在做一个使用美国县数据的小项目。我对 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
}