2

クエリ式に関する本の例に従っています。私は本に書かれているとおりに入力したわけではありません。驚いたことに、F# の内部結合クエリでもシーケンスの順序が重要です。この本では、順序についてはまったく言及されておらず、msdnは順序が重要であるとだけ述べています。しかし、なぜ内部結合でも問題になるのでしょうか?

これはコンパイルされず、次のように表示されますnamespace or module fa is not defined。についても同じf

query { for f in QuerySource.films do
        join fa in QuerySource.filmActors on (fa.FilmId = f.Id)
        join a in QuerySource.actors on (fa.ActorId = a.Id)
        select (f.Name, f.ReleaseYear, a.LastName, a.FirstName)
      }

しかし、これは: query { for f in QuerySource.films do join fa in QuerySource.filmActors on (f.Id = fa.FilmId) join a in QuerySource.actors on (fa.ActorId = a.Id) select (f.Name, f.ReleaseYear, a.LastName, a.FirstName) }

EDIT1:それは問題ではないと思いますが、明確にするためにここにQuerySourceモジュールがあります

module QuerySource = 
    open System

type Film = {Id : int; Name: string; ReleaseYear : int; Gross : Nullable<float>}
            override x.ToString() = sprintf "%s (%i)" x.Name x.ReleaseYear

type Actor = {Id : int; FirstName : string; LastName : string}
             override x.ToString() = sprintf "%s %s" x.LastName x.FirstName

type FilmActor = {FilmId : int; ActorId : int}

let films = 
        [   {Id = 1; Name = "The Terminator"; ReleaseYear = 1984; Gross = Nullable 38400000.0}
            {Id = 2; Name = "Predator"; ReleaseYear = 1987; Gross = Nullable 59735548.0}
            {Id = 3; Name = "Commando"; ReleaseYear = 1985; Gross = Nullable 38122105.0}
            {Id = 4; Name = "The Running Man"; ReleaseYear = 1987; Gross = Nullable<float>()}
            {Id = 5; Name = "Conan the Destroyer"; ReleaseYear = 1984; Gross = Nullable<float>()}
        ]
let actors = [{Id = 1; FirstName = "Arnold"; LastName = "Schwarzenegger"}
              {Id = 2; FirstName = "Linda"; LastName = "Hamilton"}
              {Id = 3; FirstName = "Carl"; LastName = "Weathers"}
              {Id = 4; FirstName = "Jesse"; LastName = "Ventura"}
              {Id = 5; FirstName = "Vernon"; LastName = "Wells"}
             ]
let filmActors = 
    [ {FilmId = 1; ActorId = 1}
      {FilmId = 1; ActorId = 2}
      {FilmId = 2; ActorId = 1}
      {FilmId = 2; ActorId = 3}
      {FilmId = 2; ActorId = 4}
      {FilmId = 3; ActorId = 1}
      {FilmId = 3; ActorId = 5}
      {FilmId = 4; ActorId = 1}
      {FilmId = 4; ActorId = 4} // internationally omitted for filmid = 5
    ]`
4

1 に答える 1

-3

順序は、パフォーマンスに関して重要な場合があります。結合されたテーブルのサイズが大幅に異なる場合、クエリは、2 番目のテーブルを開始する前に、すべての対応する値についてテーブルの 1 つを検索し始めます。小さいテーブルから開始すると、より速く終了します。

于 2016-01-03T15:10:05.050 に答える