2016-04-03 115 views
4

我在嘗試將我的類型的屬性映射到Cassandra中的映射時出現問題。F中的Cassandra CQL映射#

我有工作在C#,但我與F#掙扎

我得到的錯誤是:堆棧跟蹤:[System.ArgumentOutOfRangeException:表達式x =>新Tuple`2(x.Id,ToFSharpFunc (x => x.WithName(「player_id」)))不是屬性或字段。參數名稱:表達式]

第26行,如果我刪除了「fun(x:ColumnMap) - > x.WithName(」player_id「)」它會編譯,但不會映射到正確的表列。我的模型屬性名稱是「ID」,但我需要它映射到「player_id」

open Cassandra 
open Cassandra.Mapping 
open System 

type Ranking = 
{ Id : Guid 
    Alias : string 
    Kills : int 
    Deaths : int } 

type Player = {Id: Guid; Alias: string; Dob: DateTime; FullName: string} 

type CassyMappings() = 
inherit Cassandra.Mapping.Mappings() 
do 
    base.For<Player>() 
      .TableName("players") 
      .PartitionKey("player_id") 
      .Column(fun(x:Player)-> x.Id) 
      .Column(fun(x:Player)-> x.Alias) 
      .Column(fun(x:Player)-> x.FullName) 
      .Column(fun(x:Player)-> x.Dob) |> ignore 
    base.For<Ranking>() 
     .TableName("rankings") 
     .PartitionKey("player_id") 
     .Column(fun (x : Ranking) -> x.Id, fun(x:ColumnMap)->x.WithName("player_id")) 
     .Column(fun (x : Ranking) -> x.Alias) 
     .Column(fun (x : Ranking) -> x.Kills) 
     .Column(fun (x : Ranking) -> x.Deaths) |> ignore 

MappingConfiguration.Global.Define<CassyMappings>() 

printfn "Works fine!" 

https://dotnetfiddle.net/8IiYhg

這裏是將C#http://www.datastax.com/dev/blog/csharp-driver-cassandra-new-mapper-linq-improvements

+1

把你的代碼在實際的問題。此外,請解釋什麼「掙扎與F#的意思」 - 包括任何錯誤消息等 –

+0

當然,沒問題..我創建了一個DotNetFiddle它[這裏](https://dotnetfiddle.net/8IiYhg) 我的錯誤是「堆棧跟蹤: [System.ArgumentOutOfRangeException:Expression x => new Tuple'2(x.Id,ToFSharpFunc(x => x.WithName(」player_id「)))不是屬性或字段 參數名稱:expression]「 –

+0

在第26行,如果我刪除了」fun(x:ColumnMap) - > x.WithName(「player_id」)「它會編譯但不會映射到正確的表列。我的模型屬性名稱是「Id」,但我需要它映射到「player_id」 –

回答

3

你缺少括號的鏈接。

在線路26中的表達式得到編譯爲:

.Column(fun (x : Ranking) -> (x.Id, fun(x:ColumnMap)->x.WithName("player_id"))) 

即,作爲取Ranking作爲參數,併產生的int的元組和作爲結果的函數的表達式。只是爲了更清楚,這裏是相同的代碼的增強版本:

.Column(
    fun (x : Ranking) -> 
     let id = x.Id 
     let f = fun (x:ColumnMap)->x.WithName("player_id") 
     id, f) 

這樣的表達式的結果是一個Tuple<_,_>和CQL解釋需要一個簡單的屬性訪問代替,而這正是它告訴你在錯誤信息中。

但你真的(顯然)打算做的是調用一個不同的過載.Column,它需要兩個參數,一個表達式和一個函數。爲了防止編譯器在考慮第二個功能與前一功能的身體的一部分,您只需要添加圍繞這兩個函數的括號:

.Column(
    (fun (x : Ranking) -> x.Id), 
    (fun (x:ColumnMap)->x.WithName("player_id"))) 

或者把它放在一個行:

.Column((fun (x : Ranking) -> x.Id), (fun (x:ColumnMap)->x.WithName("player_id"))) 
+0

很棒!謝謝你的解釋 –