2016-04-03 3 views
4

У меня возникла проблема с попыткой сопоставить свойство в моем типе с отображением в Cassandra.Cassandra CQL Mapping in F #

У меня он работает в C#, но я борюсь с F #

Ошибка я получаю: Трассировка стека: [System.ArgumentOutOfRangeException: Выражение х => новый Tuple`2 (x.Id, ToFSharpFunc (x => x.WithName ("player_id"))) не является свойством или полем. Имя параметра: выражение]

on Line 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) моя ошибка is "Stack Trace: [System.ArgumentOutOfRangeException: выражение x => новый 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

отлично работает! спасибо за объяснение –