2009-04-21 10 views
8

Dato questa tabella:LINQ to SQL può riempire proprietà non-ColumnAttribute con contrassegno quando si utilizza DataContext.ExecuteQuery?

CREATE TABLE [Comments] 
(
    [Id] [int] IDENTITY(1, 1) NOT NULL, 
    [Text] [nvarchar](600) NOT NULL 
) 

Con questo modello di classe:

[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; } 
} 

E 'possibile per un DataContext per riempire la proprietà ArbitraryText quando si utilizza il metodo ExecuteQuery:

var comments = db.ExecuteQuery<Comment>("select Id, [Text], 'hello' [ArbitraryText] from Comments"); 

E' sembra che l'algoritmo di mappatura delle entità ignori qualsiasi proprietà non contrassegnata con ColumnAttribute, ma esiste un altro modo di facendo questo?

Preferirei non dover eseguire la mappatura da solo, ma questa sembra la mia unica opzione.


Edit: Che cosa è fastidiosa è che la funzione DataContext.ExecuteQuery riempirà un oggetto POCO da una query:

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

Quindi la mia soluzione attuale è quella di avere una classe interna sul mio oggetto LINQ-mapped che detiene i dati aggiuntivi restituiti dalla mia query aggregata. Questo è non ottimale, poiché alcune proprietà sono duplicate (ad esempio, Id e Testo).

risposta

2

Non per quanto ne so. Probabilmente potresti fare cose sgangherate per sposare dati da una UDF, forse - ma a parte questo, vorrai essere in grado di mappare le colonne.

(dove l'UDF restituisce solo il testo arbitrario e il commento-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 - un po 'ho scritto un few variants on ExecuteQuery che potrebbe essere utile se avete bisogno di utilizzare questo approccio per un sacco di cose diverse ... Personalmente, probabilmente proverei a risolvere il problema prima, però.

+0

Questa è una buona idea! Tuttavia, ci sforziamo molto per non avere alcun proc memorizzato, poiché il loro mantenimento è un totale PITA. È solo SQL LINQ o parametrizzato (come nel caso qui). Sto solo non capendo come DataContext funzioni come previsto su oggetti che non hanno attributi System.Data.Linq.Mappings, ma non per oggetti mappati. Grazie per aver risposto! +1 –

Problemi correlati