Linq where条件下的元组

Linq where条件下的元组,linq,f#,equality,Linq,F#,Equality,考虑到F# 元组具有自动定义的相等操作 因此 let myQueryable = [| (1, 1); (2,2)|].AsQueryable() let check = query { for x in myQueryable do } |> Seq.where(fun x -> x = (2,2)) 是{(2,2)},那为什么 let check = query { for x in myQuery

考虑到F#

元组具有自动定义的相等操作

因此

let myQueryable = [| (1, 1); (2,2)|].AsQueryable()
let check =
    query {
        for x in myQueryable do
        } |> Seq.where(fun x -> x = (2,2))
{(2,2)}
,那为什么

let check =
        query {
            for x in myQueryable do
            where(x = (2, 2))
            }

是否为空

您可能已经打开了
System.Linq

在这两种情况下,以下为我返回
(2,2)

//open System
//open System.Linq

let myQueryable = [| (1, 1); (2,2) |] //.AsQueryable()
let check =
    query {
            for x in myQueryable do
            select x
          } |> Seq.where(fun x -> x = (2,2))

check //val it : seq<int * int> = seq [(2, 2)]
let check' =
        query {
            for x in myQueryable do
            where (x = (2, 2)) 
            select x
            }

check' //val it : seq<int * int> = seq [(2, 2)] 
//开放系统
//开放系统
设myQueryable=[|(1,1);(2,2)|]/.AsQueryable()
让我查一查=
质疑{
对于myQueryable do中的x
选择x
}|>序列位置(乐趣x->x=(2,2))
检查//valit:seq=seq[(2,2)]
让我们检查一下=
质疑{
对于myQueryable do中的x
式中(x=(2,2))
选择x
}
选中“//valit:seq=seq[(2,2)]

因此,在
IQueryable
中,这种结构上的平等性并不成立。我不知道这是因为IQueryable类型,也就是说,它变成了引用相等,或者是重新定义了
,或者是一个可能的bug

这似乎是C#
System.Tuple
和F#reference Tuple之间的兼容性问题

有趣的是,C#7和F#4.1之间的兼容性问题似乎得到了解决,新的
ValueTuple
等价于F#结构元组

let myQueryableNew = [| ValueTuple.Create(1, 1); ValueTuple.Create(2,2) |].AsQueryable()
let resultFSharp1 =
    query {
            for x in myQueryableNew do
          } |> Seq.where(fun x -> x = ValueTuple.Create(2,2))

let resultFSharp2 =
        query {
            for x in myQueryableNew do
            where (x.Equals(ValueTuple.Create(2, 2))) 
            }
顺便说一句,还要注意新类型有一个更一致的默认值(在这种情况下)

是的,它是通过C#->F#互操作实现的:C#元组自动编译为F#元组,反之亦然
let testDefault =
        query {
            for x in myQueriable1 do
            where (x.Equals(ValueTuple.Create(1, 2))) 
            select x
            headOrDefault
            }