2009-04-01 19 views
9

¿Cómo le digo a un contexto de datos de LINQ que ignore las propiedades específicas, o todas las propiedades de solo lectura, al vincular un conjunto de resultados a un objeto?Ignorar las propiedades de clase de solo lectura al usar DataContext.ExecuteQuery <T>

Estoy trabajando con algunas declaraciones de T-SQL que son difíciles de expresar usando LINQ, así que estoy usando el método ExecuteQuery del contexto de datos para pasar el T-SQL directo a la base de datos.

Si mi clase T tiene propiedades de solo lectura, obtengo excepciones en tiempo de ejecución cuando el contexto de datos intenta establecer esas propiedades y falla porque no hay ninguna propiedad de establecimiento. ¿Cómo le digo al contexto que ignore esas propiedades?

Esto es lo que estoy haciendo ahora. Funciona, pero es una mierda:

public bool IsPaidInFull { 
    get { return NetTotal <= 0m; } 
    set { /* needed so linq doesn't choke. Should never be set by hand */ } 
} 
+0

Debo ser el primero en sugerir - "do not _do_ that"? –

+1

No hagas exactamente qué? La solución es un pecado, y es inaceptable, de ahí mi publicación aquí. Si quiere decir "no encuentra una manera de omitir ciertas propiedades cuando se vincula al conjunto de resultados", ¿podría explicarlo? –

Respuesta

0

¿Has considerado Linq para las entidades? Puede que no valga la pena convertir su proyecto, dependiendo de lo avanzado que esté, o de la cantidad de sobrecostos con los que se sienta cómodo. Sin embargo, este escenario exacto no sería un problema en Linq para las entidades. No intenta actualizar las propiedades de solo lectura en el objeto cuando lo carga, porque no están mapeadas explícitamente, son simplemente propiedades de extensión.

Además, puede ir por la ruta old-school/java mediante el uso de funciones getter en lugar de propiedades. public bool getIsPaidInFull() {return NetTotal < = 0m;}.

O podría jugar con la implementación de las propiedades de solo lectura en una clase hija heredada, pero eso puede introducir todo tipo de problemas de tipo.

+0

Desafortunadamente no es una solución posible para este proyecto, pero gracias por la sugerencia. Creo que podríamos considerar un ORM completo en el futuro; L2S es genial como un simple contenedor sobre el modelo de datos, pero puede ser doloroso usarlo como una capa de mapeo para las entidades. Estoy aceptando su sugerencia de "escuela vieja" como la respuesta. Parece que no puedo encontrar una mejor solución, y los métodos getter son mejores que mi solución actual. –

1
public bool IsPaidInFull 
{ 
    get { return NetTotal <= 0m; } 
    private set { ;} 
} 
+0

Esto es malo ... –

+0

Debe tener algo que ver con la reflexión utilizada por el contexto de datos. Imagino que el contexto de datos utiliza la reflexión para verificar si hay un getter y un setter en su propiedad, pero no verifica el modificador de acceso. Y como nunca usa el setter, no hay ningún problema con el acceso. – AndyClaw

Cuestiones relacionadas