2009-05-12 21 views
17

¿Hay alguna manera de no buscar una columna específica usando linqtosql sin tener que usar un tipo anónimo y especificar cada archivo devuelto individualmente?Linq a SQL - No recuperar una columna en particular

Usamos SQLMetal para generar el archivo dbml que contiene todos los tipos en los que poner los resultados de los datos consultados. Sin embargo, cuando se seleccionan columnas en la consulta linq, los resultados entran en un tipo anónimo en lugar del tipo declarado en el archivo dbml. Me gustaría seleccionar todos menos uno de las columnas de una tabla en particular, pero todavía tengo los resultados devueltos en el tipo de dbml relacionado.

Cualquier idea apreciada.

Respuesta

1

Gracias por su contribución. La solución final en la que me he basado es simplemente especificar las columnas que quiero traer de vuelta PERO hacer esto dentro de la declaración de Linq en un nuevo objeto del tipo que quiero ... ¡un ejemplo debería ayudar!:

registro de la tabla tiene tres columnas

  • identificación de registro
  • DateLogged
  • SerializedData

Pero yo sólo quiero DateLogged & datos serializados. Sin embargo, me gustaría que esta dentro de un datacontainer generada por SQLMetal

he conseguido esto con la siguiente declaración:


q = Dim De logItem En dc.Log Seleccione Nuevo registro con .LogID = { logItem.LogID, .DateLogged = logItem.DateLogged}


la esperanza de que ayude a alguien más por ahí!

+1

usted está correcto, se puede utilizar una clase de "llamada" en lugar de una clase anónima, pero aún así "especifica cada campo devuelto individualmente", que dijiste en tu pregunta que no querías hacer: P – Lucas

0

La forma en que LINQ to SQL sabe qué columnas incluir es por el tipo anónimo que proyecta sobre la consulta. No creo que exista otra forma de excluir columnas de LINQ a SQL, ya que una proyección directa devolverá todo.

17

LINQ to SQL admite lazy loading propiedades individuales. En el diseñador de DBML, puede establecer Delay Loaded en true en las propiedades de una columna. Las columnas que se cargan con retraso no se incluirán en el SELECT inicial. Si intenta acceder a la propiedad del objeto y aún no se ha cargado, se ejecutará otra declaración SELECT para traer este valor del DB.

Si está editando el archivo DBML a mano, configure <Column IsDelayLoaded="true">. Si escribe las clases de LINQ a SQL a mano, es tan simple como declarar el campo de respaldo de la propiedad como Link<T> en lugar de T. Por ejemplo:

[Table] 
public class Person 
{ 
    private Link<string> _name; 

    [Column(Storage = "_name")] 
    public string Name 
    { 
     get { return _name.Value; } 
     set { _name.Value = value; } 
    } 
} 

Véase también la sección "Delay/Lazy Loading" en this post by Scott Guthrie.


Actualización: La respuesta anterior se aplica si desea que la columna esté disponible cuando la necesite. No se incluirá en SELECT s a menos que lo solicite específicamente (consulte LoadOptions) o intente acceder a él.

Si simplemente no desea utilizar o acceder a la columna en absoluto, y no desea que esté disponible como propiedad de clase, entonces vaya con Serapth's answer de eliminar la columna del archivo DBML. Asegúrese de comprender las implicaciones, como la pérdida de la comprobación de concurrencia en esa columna.

4

Si es extremadamente vago, ¿por qué no agrega la tabla por segunda vez a través del diseñador de DBML, renómbrela MyTableWithOutColumnX y luego elimine el registro que no desea que se devuelva? Simplemente ingrese el nombre de la columna y presione eliminar.

Es descuidado, pero luego, hasta cierto punto, también lo es tener una mesa donde un registro no debería aparecer a veces. Más que nada, es fácil, todo está resumido en DBML, por lo que no debería afectar su código, salvo cambiar a qué tabla acceder. Bien nombrado, incluso podría tener sentido para alguien que mantenga su código en un futuro lejano.

1

Mire this link para ver un ejemplo de cómo habilitar la carga diferida de columnas usando SQLMetal.

Básicamente utiliza XSLT para post-procesar el archivo generado para convertir el tipo de columna X a Link<X> (ambos tipos de la System.Data.Linq namesapce)

Cuestiones relacionadas