2012-10-02 20 views
7

Recientemente comencé a trabajar con ServiceStack y su marco ORMLite. Busqué en Google y busqué el código fuente, pero no pude encontrar nada relevante.ServiceStack ORMLite - Seleccionar columnas

¿Hay alguna manera de seleccionar columnas específicas al ejecutar una consulta con ORMLite? Algo así: Db.First<Model>(q => q.Id == someId, "Column1, Column2")

A menos que haya omitido esta característica, me sorprende que nadie haya preguntado antes sobre esto, ya que esta es una regla general para optimizar sus transacciones de base de datos.

+0

Hola cobolstinks, y gracias por su respuesta. Creo que estás hablando de la versión de Java que debe ejecutarse en dispositivos móviles. De hecho, me estoy refiriendo a la estructura ServiceStack.ORMLite, que es un puerto C# destinado a ser utilizado en las aplicaciones ASP.Net – Alexis

+0

Por si fuera poco me estaba refiriendo a ormlite y lo estaba usando con ADK. Eliminé mi comentario original. – cobolstinks

Respuesta

7

Si desea especificar columnas de otro tipo que la mesa tiene que utilizar SQL como seen in this earlier example

Así, en su caso, usted podría hacer algo como:

Db.First<Model>("SELECT Column1, Column2 FROM AnyTableOrView"); 

También puede crear un modelo parcial que mira a su mesa por la decoración con el atributo [Alias], como:

[Alias("AnyTableOrView")] 
public class Model { 
    public int Id { get; set; } 
    public string Column1 { get; set; } 
    public string Column2 { get; set; } 
} 

a continuación, puede hacer algo como:

Db.First<Model>(q => q.Id == someId); 

Y solo SELECCIONAR + rellenar campos del modelo parcial.

+0

Estaba usando la primera forma que describió, pero su segundo enfoque es mucho más limpio. Gracias y sigan con el buen trabajo. – Alexis

+0

np y gracias :) – mythz

+0

En caso de que alguien se pregunte, si alias su atributo Id, también tiene que alias en el modelo desglosado que utiliza para consultar. – Alexis

2

Yo probé esto:

  1. creado una vista de base de datos (nombre de tabla y columnas ya están configurados)
  2. creado una clase llamada "Eventos" y emparejando cada campos para esa mesa con una propiedad (i utilizado [alias] para el nombre de tabla y para todas las columnas que tienen nombres bonitos)
  3. Has escrito el acceso a la base de datos para seleccionar 1 registro en función de su ID

    var dbFactory = new OrmLiteConnectionFactory(
         "Data Source=MyDB;User Id=user;Password=pwd", // Connection String 
         OracleDialect.Provider); 
    
        using (var db = dbFactory.OpenDbConnection()) 
        { 
          var event = db.GetByIdOrDefault<Event>(request.Id); 
        } 
    

En ese punto, se completa el 'evento' var pero solo se rellena el campo Id. todos los demás campos de la clase no están completos (mientras que realmente hay datos en la base de datos).

Es lo más simple que puedo hacer y no funciona. Algunas ideas ? (PD: estoy usando OrmLite para Oracle)

Gracias

1

he encontrado el problema. Se debió a una coincidencia de tipos incorrecta entre el campo de mi clase (definida como una cadena) y el campo Oracle correspondiente (que es una FECHA).

Reemplacé la cadena con datetime y funcionó a las mil maravillas.

Por lo tanto, funciona perfectamente con una VISTA y eso simplifica enormemente el código.

1

Tuve un problema similar, sin embargo, mi solución fue diferente.

Tenía una propiedad int en mi POCO. Mi consulta (de Oracle) devolvía un nulo para esta propiedad. Causó una excepción y se evitó un procesamiento posterior de esa fila. El resultado fue un POCO parcialmente poblado.

La solución fue cambiar al tipo para ser anulable.

public int? mypropperty 
Cuestiones relacionadas