2009-04-21 8 views
8

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).

Respuesta

2

No es lo que yo sé. Probablemente puedas hacer cosas complicadas para unir datos de un UDF, pero, aparte de eso, va a querer poder mapear las columnas.

(donde la UDF sólo devuelve el texto arbitrario y el comentario-id)

var qry = from row in db.SomeUdfQuery(someArgs) 
      join comment in db.Comments 
      on row.Id equals comment.Id 
      select new {Comment = comment, row.ArbitraryText}; 

var comments = new List<Comment>(); 
foreach(var record in qry) { 
    record.Comment.ArbitraryText = record.ArbitraryText; 
    comments.Add(record.Comment); 
} 
return comments; 

alternativa - Hace un tiempo escribí un few variants on ExecuteQuery que podría ser útil si usted necesita utilizar este enfoque para un montón de cosas diferentes ... Personalmente, probablemente trataría de eludir el problema primero, sin embargo.

+0

¡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 –

Cuestiones relacionadas