[英]Using NoRM to access MongoDB from F#
從F#中測試NoRM https://github.com/atheken/NoRM ,並嘗試找到一種使用它的好方法。 這是基本的C#:
class products
{
public ObjectId _id { get; set; }
public string name { get; set; }
}
using (var c = Mongo.Create("mongodb://127.0.0.1:27017/test"))
{
var col = c.GetCollection<products>();
var res = col.Find();
Console.WriteLine(res.Count().ToString());
}
可以,但是這是我從F#訪問它的方式:
type products() =
inherit System.Object()
let mutable id = new ObjectId()
let mutable _name = ""
member x._id with get() = id and set(v) = id <- v
member x.name with get() = _name and set(v) = _name <- v
有沒有更簡單的方法來創建類或類型以傳遞給泛型方法?
以下是它的調用方式:
use db = Mongo.Create("mongodb://127.0.0.1:27017/test")
let col = db.GetCollection<products>()
let count = col.Find() |> Seq.length
printfn "%d" count
您是否嘗試過記錄類型?
type products = {
mutable _id : ObjectId
mutable name : string
}
我不知道它是否有效,但是當您只需要一個基本上是“一組字段”的類時,記錄通常會很好。
出於好奇,您可以嘗試將無參數的構造函數添加到記錄中。 這絕對是黑客-實際上,它使用的是F#編譯器中的錯誤-但這可能有效:
type Products =
{ mutable _id : ObjectId
mutable name : string }
// Horrible hack: Add member that looks like constructor
member x.``.ctor``() = ()
member
聲明添加了一個具有特殊.NET名稱的成員,該member
用於構造函數,因此.NET認為它是構造函數。 我會非常小心地使用它,但是它可能會在您的情況下起作用,因為該成員通過反射顯示為構造函數。
如果這是獲得與MongoDB這樣的庫一起使用的簡潔類型聲明的唯一方法,那么它將有希望激勵F#團隊在未來版本的語言中解決問題(例如,我可以很容易地想象一些強制F#的特殊屬性)編譯器添加無參數構造函數)。
這是一種定義接近C#定義的類的簡便方法:它具有默認構造函數,但使用公共字段而不是getter和setter,這可能是個問題(我不知道)。
type products =
val mutable _id: ObjectId
val mutable name: string
new() = {_id = ObjectId() ; name = ""}
或者,如果您可以使用字段的默認值(在這種情況下,全部為null):
type products() =
[<DefaultValue>] val mutable _id: ObjectId
[<DefaultValue>] val mutable name: string
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.