2014-01-06 87 views
6

我已經運行對NHibernate的以下C#LINQ查詢:F#LINQ查詢和可空鑄造

var items = new int[] { 1,2}; 

var c11 = session.Query<Parent>() 
    .Where(p => p.Children.Any(c => items.Contains((int)c.FIELD))).ToList(); 

在這種情況下c.FIELDNullable<int>,當我檢查IL碼鑄造爲int轉化爲Expression.Convert

如何翻譯這個F#,因爲與F#我不能投了Nullable<int>int。我只能調用op_Explicit,但它會變成不同的表達式,而不是Expression.Convert。我被困在這一點上。

+0

爲什麼不使用'c.FIELD.GetValueOrDefault()'或'c.FIELD.Value'? –

+1

因爲它們被翻譯成Expression.Invoke而不是Expression.Convert,並且NHibernate需要Expression.Convert – emperon

+1

如果它可以在Nullable上處理'(int)'強制轉換但不是'.Value',那麼這是NHibernate中的一個錯誤LINQ實現。 –

回答

0

你正在尋找的東西是Operators.int<^T> Function

的參數符號的32位整數轉換。這是所有原始數字類型的直接轉換。對於字符串,使用Parse和InvariantCulture設置轉換輸入。否則,操作需要在輸入類型上使用適當的靜態轉換方法。

query { for parent in session.Query<Parent>() do 
     where (parent.Children.Any (fun c -> items.Contains (int c.FIELD))) 
     select parent }