.net - mvc - Linq a SQL-No buscar una columna en particular
linq result to datatable (5)
¿Hay una manera de no obtener una columna específica usando linqtosql sin tener que usar un tipo anónimo y especificar cada archivo devuelto individualmente?
Utilizamos SQLMetal para generar el archivo dbml que contiene todos los tipos en los que colocar los resultados de los datos consultados. Sin embargo, cuando se incluyen columnas seleccionadas en la consulta de linq, los resultados pasan a un tipo anónimo en lugar del tipo declarado en el archivo dbml. Me gustaría seleccionar todas las columnas, excepto una, de una tabla en particular, pero aún así me han devuelto los resultados en el tipo de dbml relacionado.
Cualquier idea apreciada.
Gracias a todos por su aporte. La solución final en la que me he conformado es simplemente especificar las columnas que quiero devolver PERO para hacer esto dentro de la declaración de Linq en un nuevo objeto del tipo que quiero ... ¡un ejemplo debería ayudar !:
Tabla de registro tiene tres columnas
- LogID
- Fecha de registro
- Datos serializados
Pero solo quiero DateLogged y datos serializados. Sin embargo, me gustaría esto dentro de un contenedor de datos generado por SQLMetal
Logré esto con la siguiente declaración:
Dim q = De logItem In dc.Log Seleccione Nuevo registro con {.LogID = logItem.LogID, .DateLogged = logItem.DateLogged}
Espero que ayude a alguien más por ahí!
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 que LINQ to SQL excluya las columnas, ya que una proyección directa lo devolverá todo.
Mire este enlace para ver un ejemplo de cómo habilitar la carga diferida de columnas usando SQLMetal.
Básicamente usa XSLT para postprocesar el archivo generado para convertir el tipo de columna de X
a Link<X>
(ambos tipos de System.Data.Linq
namesapce)
Si es muy perezoso, ¿por qué no agrega la tabla por segunda vez a través del diseñador de DBML, cambie el nombre por MyTableWithOutColumnX y luego elimine el registro que no desea que se devuelva? Simplemente hilite el nombre de la columna y pulsa eliminar.
Es descuidado, pero luego, hasta cierto punto, también lo es tener una tabla donde no debería aparecer un registro a veces. Más que nada, es fácil, todo está resumido en el DBML, por lo que no debería afectar su código, aparte de cambiar a qué tabla acceder. Bien nombrado, incluso podría tener sentido que alguien mantenga su código en un futuro lejano.
LINQ to SQL admite la carga perezosa de propiedades individuales. En el diseñador 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 instrucción SELECT
para traer este valor desde la base de datos.
Si está editando el archivo DBML a mano, establezca <Column IsDelayLoaded="true">
. Si escribe sus clases de LINQ to SQL a mano, es tan simple como declarar el campo de respaldo de la propiedad como un Link<T>
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; }
}
}
Consulte también la sección "Carga demorada / perezosa" en esta publicación de Scott Guthrie .
Actualización: la respuesta anterior se aplica si desea que la columna siga estando 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 quiere usar o acceder a la columna, y no quiere que esté disponible como una propiedad de clase, vaya con la respuesta de Serapth de eliminar la columna del archivo DBML. Asegúrese de comprender las implicaciones, como la pérdida de comprobación de concurrencia en esa columna.