.net - tabla - LINQ2SQL: ¿Cómo modificar los valores de los campos al cargar entidades anónimas?
como eliminar una columna en la tabla de atributos arcgis (5)
!!! No redirija a este artículo , ya que no resuelve el problema que se describe a continuación.
Digamos que tenemos dicha tabla en la base de datos:
SomeTable
- Yo dint)
- DT (datetime)
Hemos configurado un contexto de datos Linq2Sql. Y hemos configurado una entidad para SomeTable: el método OnLoaded modifica DT de manera que DateTimeKind de DT se convierta en Utc (inicialmente no especificado).
Ahora aquí está el problema:
Si solicitamos datos mediante el uso de una entidad completa, se llama al método OnLoaded:
From x In ourDataContext.SomeTable Select x
Pero si solicitamos solo una parte de la tabla (y, por lo tanto, generamos un tipo anónimo), no se llama a OnLoaded:
From x In ourDataContext.SomeTable Select x.DT
Está claro que OnLoaded se define en la entidad SomeTable, y no en el tipo anónimo.
Por el momento, considero la creación de entidades personalizadas que reemplazarían los tipos anónimos. Pero tal vez alguien tiene una mejor solución?
¿Puedes probar este código? En lugar de utilizar el tipo Anónimo, puede especificar el mismo tipo de tabla pero cargar solo un campo. No sé si funcionará o no en tu caso.
SomeTable.Select( x => new SomeTable {
DateField = x.DateField
})
De lo contrario, no hay una solución simple para eso.
Puede especificar DateTimeKind
dentro de la consulta:
from x in ourDataContext.SomeTable
select DateTime.SpecifyKind(x.DT, DateTimeKind.Utc)
Si va a hacer esto a menudo, un método de extensión puede ayudar a que sea menos detallado:
public static class Ext
{
public static DateTime AsUtc(this DateTime dateTime)
{
return DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
}
public static DateTime? AsUtc(this DateTime? dateTime)
{
if(dateTime == null) return null;
return AsUtc(dateTime.Value);
}
}
Entonces su consulta se convierte en:
from x in ourDataContext.SomeTable select x.DT.AsUtc()
Linq2Sql genera clases parciales para tablas lo que hace que sea muy fácil de ampliar. Simplemente agregue el archivo SomeTable.cs
a su solución (dentro del mismo espacio de nombres que su contexto db autogenerado) y defina una propiedad adicional con cualquier comportamiento que necesite:
public partial class SomeTable {
public System.DateTime CustomDT {
get { return DT.AddYears(120); }
}
}
Ahora puedes consultarlo como de costumbre:
var e = ctx.SomeTable.Select(x => new { x.CustomDT }).First();
Console.WriteLine(e.CustomDT);
Actualización :
En base a los comentarios, creo que el problema al que se enfrenta se debe a una separación incorrecta de responsabilidades. Está tratando de pasar una responsabilidad de lógica de negocios (transformación de datos) a su DAL. Si bien L2S ofrece cierta flexibilidad aquí (como se muestra arriba), usted tiene otras opciones si la solución no es satisfactoria:
- Capa explícita sobre L2S DAL. Por lo general, es un patrón de repositorio que devuelve DTO muy similar a los autogenerados por L2S. En este caso, puede ocultar la propiedad
DT
obligando a los consumidores a usar soloCustomDT
. - Coloque la lógica en la base de datos (vistas, columnas calculadas, SP). No consideraría este enfoque para un nuevo proyecto, pero podría ser una opción viable para algunas aplicaciones heredadas.
Puede usar linq-to-sql
para la parte de consulta y usar linq-to-objects
para obtener la propiedad DateTime
que desea (en realidad no está devolviendo un tipo anónimo).
(From x In ourDataContext.SomeTable _
Select x).AsEnumerable() _
.Select(Function(x) x.DT)
Tuvimos un problema similar ya que necesitábamos recibir parte de los campos de la entidad como objeto anónimo y siempre sabemos que tenemos los campos DateTimeKind
of date como DateTimeKind.UTC
sin usar funciones adicionales en la solicitud LINQ.
Probamos muchas cosas, pero solo encontramos una solución lo suficientemente buena: generación de código para Linq2Sql con T4.
PD: si desea obtener más información sobre la generación de código Linq2Sql con T4, puede comenzar desde http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx