F # - класс POCO

Привет! Я пытаюсь написать класс POCO на правильном F#... Но что-то не так..

Код С#, который я хочу «перевести» на правильный F#:

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

    public string Name { get; set; }
}

Самое близкое, что я могу подобрать к приведенному выше коду на F#, выглядит примерно так:

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

Однако, когда я пытаюсь получить доступ к свойствам версии F #, он просто возвращает ошибку компиляции, говорящую

"Поиск объекта неопределенного типа на основе информации до этой программной точки. Может потребоваться аннотация типа до этой программной точки, чтобы ограничить тип объекта. Это может позволить разрешить поиск."

Код, который пытается получить свойство, является частью моего репозитория (я использую EF Code First).

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

Что, черт возьми, происходит?

Заранее спасибо!


person ebb    schedule 30.12.2010    source источник
comment
К вашему сведению, вы можете убрать слово Attribute из своих атрибутов в F#, как и в C#. Например, [<Key>]   -  person Joel Mueller    schedule 30.12.2010
comment
Кроме того, к вашему сведению: ваше форматирование определения F # MyType испортилось, когда вы скопировали и вставили, и не будет компилироваться как есть.   -  person Stephen Swensen    schedule 31.12.2010


Ответы (1)


Ваше определение класса в порядке, проблема заключается в вашем LINQ. Метод Select ожидает аргумент типа Expression<Func<MyTest,T>>, но вы передаете ему значение типа FSharpFunc<MyTest,T> или что-то подобное в любом случае.

Дело в том, что вы не можете использовать лямбда-выражения F# напрямую с LINQ. Вам нужно написать свое выражение как F# Quotation, а затем использовать < href="http://fsharppowerpack.codeplex.com/" rel="noreferrer">F# PowerPack для запуска кода с IQueryable<> источником данных. У Дона Сайма есть хороший обзор того, как это работает.

person Joel Mueller    schedule 30.12.2010