2009-02-26 21 views
5

He escrito una aplicación que uso como agente para consultar datos de una base de datos y cargarlos automáticamente en mi caché web distribuida .LINQ-to-SQL: ExecuteQuery (Type, String) rellena un campo, pero no el otro

Lo hago especificando una consulta sql y un tipo en una configuración. El código que realmente hace la consulta es el siguiente:

List<Object> result = null; 
try { result = dc.ExecuteQuery(elementType, entry.Command).OfType<Object>().ToList(); } 
catch (Exception ex) { HandleException(ex, WebCacheAgentLogEvent.DatabaseExecutionError); continue; } 

elementType es una System.Type creado a partir del tipo especificado en la configuración (utilizando Type.GetType()), y entry.Command es la consulta SQL.

El tipo de entidad específica que estoy teniendo un problema con el siguiente aspecto:

public class FooCount 
{ 
    [Column(Name = "foo_id")] 
    public Int32 FooId { get; set; } 

    [Column(Name = "count")] 
    public Int32 Count { get; set; } 
} 

La consulta SQL tiene este aspecto:

select foo_id as foo_id, sum(count) as [count] 
from foo_aggregates 
group by foo_id 
order by foo_id 

Por alguna razón, cuando se ejecuta la consulta, la propiedad "Count" termina poblada, pero no la propiedad "FooId". Traté de ejecutar la consulta yo mismo, y se devuelven los nombres de columna correctos, y los nombres de columna coinciden con lo que he especificado en mis atributos de mapeo. ¡Ayuda!

+0

@BFree - Editar una pregunta simplemente para cambiar el estilo de codificación de otra persona es simplemente desagradable en mi humilde opinión. Por favor no. –

+0

Mi mal. No pensé que realmente quisieras hacer eso, pensé que fue un accidente. – BFree

+0

@Daniel: publicar un código que obliga a las personas a desplazarse hacia la derecha para leerlo es una gran manera de hacer que ignoren su pregunta. Apuntar a las personas que intentan ayudar es una forma aún mejor ... –

Respuesta

5

Esto es una locura ...

Lo que fija mi problema estaba decorando mi clase de entidad con la TableAttribute:

[Table(Name = "foo_aggregates")] 
public class FooCount 
{ 
    [Column(Name = "foo_id")] 
    public Int32 FooId { get; set; } 

    [Column(Name = "count")] 
    public Int32 Count { get; set; } 
} 

había asumido (erróneamente, al parecer) que ya no estaba usando el GetTable<T>() método, no necesitaba el atributo de mapeo correspondiente.

Actualización: Un año y medio después, por fin me di cuenta de que parece que las decoraciones ColumnAttribute sobre las propiedades son ignorados a menos que haya una decoración TableAttribute correspondiente en la clase. Esto explica por qué la propiedad "Count" se estaba poblando, ya que su nombre coincidiría con la columna en la declaración de SQL, mientras que FooId/foo_id por supuesto no coinciden.

+0

He sido testigo de esta solución a través de SharedView, y estoy desconcertado por ello también. – NilObject

+1

Ni siquiera necesita el Nombre si lo hace de esta manera. Puedes simplemente decir [Tabla]. – BFree

+0

Acabo de notar que también funciona para consultas más complejas. Acabo de hacer una consulta de recursión y luego lo seleccioné y funciona. –

2

Linq To Sql tiene dificultades para mapear cosas cuando los nombres de las propiedades son diferentes a los nombres de las columnas. Intente cambiar el nombre de su propiedad a foo_id con el guión bajo. Eso debería ser el truco.

O eso, o puede cambiar su declaración de selección a foo_id como FooId para que coincida con su propiedad. De cualquier manera, deberían ser iguales (sin embargo, no es necesario que sea el mismo caso).

+0

Nunca he tenido un problema con el mapeo, siempre y cuando especifique el nombre correcto de la columna en el atributo de mapeo ... aunque esto tendría más sentido que el problema en realidad, ja (ver mi respuesta) –

+0

Bueno, normalmente cuando arrastra las tablas/procedimientos almacenados en el descriptor de Linq a Sql, hace todo eso por usted, por lo que no presta atención a los atributos de la tabla.Te enfocas más en las cosas de la columna. Aprende algo nuevo todos los días ... – BFree

+0

Dejé de usar el diseñador cuando comencé a recibir errores de compilación aleatoria al usarlo. Me resulta igual de fácil escribir las propiedades como lo hice anteriormente, y es más fácil de administrar en el proyecto (en mi humilde opinión), código más limpio, etc. –

Cuestiones relacionadas