Teniendo en cuenta esta tabla:¿Puede LINQ to SQL llenar las propiedades no marcadas por el atributo Column al usar DataContext.ExecuteQuery?
CREATE TABLE [Comments]
(
[Id] [int] IDENTITY(1, 1) NOT NULL,
[Text] [nvarchar](600) NOT NULL
)
Con esta clase de modelo:
[Table(Name="Comments")]
public class Comment
{
[Column(AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
public int Id { get; set; }
[Column(DbType = "NVarChar(600) NOT NULL", CanBeNull = false)]
public string Text { get; set; }
public string ArbitraryText { get; set; }
}
¿Es posible que un DataContext para llenar la propiedad ArbitraryText
cuando se utiliza el ExecuteQuery
método:
var comments = db.ExecuteQuery<Comment>("select Id, [Text], 'hello' [ArbitraryText] from Comments");
Se parece que el algoritmo de mapeo de entidades ignora cualquier propiedad no marcada con ColumnAttribute
, pero ¿hay otra forma de ¿haciendo esto?
Preferiría no tener que hacer el mapa yo mismo, pero esta parece ser mi única opción.
Editar: Lo que es molesto es que la función DataContext.ExecuteQuery llenará un objeto POCO de una consulta:
public class PlainOldCSharpObject
{
public int Id { get; set; }
public string Text { get; set; }
public string ArbitraryText { get; set; }
}
...
// DataContext correctly fills these objects
var pocos = db.ExecuteQuery<PlainOldCSharpObject>("select Id, [Text]...
Así que mi solución actual es tener una clase interna en mi objeto mapeado-LINQ que contiene los datos adicionales que devuelve mi consulta agregada. Esto no es óptimo, ya que algunas propiedades están duplicadas (por ejemplo, Id y Texto).
¡Esta es una muy buena idea! Sin embargo, tratamos muy duro de no tener ningún proceso almacenado, ya que su mantenimiento es un PITA total. Es solo LINQ-only o SQL parametrizado (como es el caso aquí). Simplemente no entiendo cómo funciona el DataContext como se espera en objetos que no tienen atributos System.Data.Linq.Mappings, pero no para objetos mapeados. ¡Gracias por responder! +1 –