Pregunta
Hola! Estoy tratando de escribir una clase POCO adecuada en F # ... Pero algo está mal ..
El código C # que quiero "traducir" a F # adecuada es:
public class MyTest
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
}
Lo más cerca que puedo llegar al código anterior en Fa # es algo como:
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
Sin embargo, cuando intento acceder a las propiedades de la versión F # simplemente devuelve un error de compilación diciendo
"búsqueda del objeto de tipo indeterminado sobre la base de la información antes de este punto del programa. Un tipo de anotación puede ser necesaria antes de este punto del programa para restringir el tipo de objeto. Esto puede permitir que las operaciones de búsqueda que se resuelva. "
Las eso es código que tratan de obtener la propiedad es una parte de mi repositorio (estoy usando Código EF primero).
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é demonios está pasando?
Gracias de antemano!
Solución
Su definición de clase está muy bien, es su LINQ que tiene un problema. El método Select
espera un argumento de tipo Expression<Func<MyTest,T>>
pero estás pasándolo a un valor de tipo FSharpFunc<MyTest,T>
-. O algo similar a eso de todos modos
El punto es que no se puede usar F # expresiones lambda directamente con LINQ. Usted tiene que escribir su expresión como un F # Cotización y luego usar el < a href = "http://fsharppowerpack.codeplex.com/" rel = "noreferrer"> F # PowerPack para ejecutar el código en un origen de datos IQueryable<>
. Don Syme tiene un buena visión general de cómo funciona este .