2010-12-30 1 views
4

Salut! Je suis en train d'écrire une classe POCO dans une bonne F # ... Mais quelque chose est faux ..F # - POCO classe

Le code C# que je veux "traduire" au bon F # est:

public class MyTest 
{ 
    [Key] 
    public int ID { get; set; } 

    public string Name { get; set; } 
} 

Le plus proche I peut venir au code ci-dessus en F # est quelque chose comme:

type Mytest() = 

    let mutable _id : int = 0; 
    let mutable _name : string = null; 

    [<KeyAttribute>] 
    member x.ID 
     with public get() : int = _id 
     and public set(value) = _id <- value 

    member x.Name 
     with public get() : string = _name 
     and public set value = _name <- value 

Cependant lorsque je tente d'accéder aux propriétés de la version F #, il retourne juste une erreur de compilation en disant

« Loo kup sur un objet de type indéterminé sur la base des informations antérieures à ce point de programme. Une annotation de type peut être nécessaire avant ce point de programme pour contraindre le type de l'objet. Cela peut permettre à la recherche à résoudre. »

Le code des thats essayant d'obtenir la propriété est une partie de mon dépôt (j'utilise le code EF Première).

module Databasethings = 

    let GetEntries = 
     let ctx = new SevenContext() 
     let mydbset = ctx.Set<MyTest>() 
     let entries = mydbset.Select(fun item -> item.Name).ToList() // This line comes up with a compile error at "item.Name" (the compile error is written above) 
     entries 

Qu'est-ce que l'enfer est passe?

Merci à l'avance!

+0

Pour votre information, vous pouvez laisser le mot « attribut » hors de vos attributs en F #, comme vous pouvez en C#. Par exemple, '[]' –

+0

Aussi FYI - votre F # 'la mise en forme de définition MyType' mais j'ai foiré quand vous copié et collé et ne compilera pas comme il est. –

Répondre

7

votre définition de classe est très bien, il est votre LINQ qui a un problème. La méthode Select attend un argument de type Expression<Func<MyTest,T>> mais vous faisant passer une valeur de type FSharpFunc<MyTest,T> - ou quelque chose de similaire à celui de toute façon.

Le point est que vous ne pouvez pas utiliser F expressions # lambda directement avec LINQ. Vous devez écrire votre expression en tant que F# Quotation puis utilisez le F# PowerPack pour exécuter le code contre une source de données IQueryable<>. Don Syme a un good overview of how this works.