2009-04-21 7 views
8

Biorąc poniższej tabeli:Czy LINQ do SQL może wypełnić właściwości oznaczone znacznikiem innym niż ColumnAttribute podczas korzystania z DataContext.ExecuteQuery?

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

z tym modelem klasy:

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

Czy to możliwe, że DataContext wypełnić właściwość ArbitraryText przy użyciu metody ExecuteQuery:

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

It wydaje się, że algorytm mapowania encji ignoruje każdą właściwość nie oznaczoną ColumnAttribute, ale czy istnieje inny sposób robiąc to?

Ja wolałbym nie robić tego mapowania, ale to wygląda na jedyną opcję.


Edycja: Co jest irytujące jest to, że funkcja DataContext.ExecuteQuery wypełni POCO obiektu z kwerendy:

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

Więc mój obecny rozwiązaniem jest mieć wewnętrzną klasę na moim LINQ odwzorowany obiektu przechowuje dodatkowe dane, które zwraca moje zagregowane zapytanie. Jest to nieoptymalne, ponieważ niektóre właściwości są duplikowane (na przykład Id i tekst).

Odpowiedz

2

Nie tak daleko, jak wiem. Prawdopodobnie mógłbyś zrobić pewne nieczytelne rzeczy, by poślubić dane z UDF - ale poza tym, będzie chciał mieć możliwość mapowania kolumn.

(gdzie UDF prostu zwraca dowolny tekst i komentarz-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; 

Alternatywnie - A gdy napisałem few variants on ExecuteQuery, która może być przydatna, gdy trzeba użyć tego podejścia do wielu różnych rzeczy ... Osobiście prawdopodobnie spróbuję najpierw rozwiązać problem.

+0

To bardzo dobry pomysł! Staramy się jednak nie mieć żadnych zapisanych proców, ponieważ ich utrzymanie jest całkowitą PITA. Jest to albo LINQ albo sparametryzowany SQL (jak w tym przypadku). Po prostu nie rozumiem, jak DataContext działa zgodnie z oczekiwaniami na obiektach, które nie mają atrybutów System.Data.Linq.Mappings, ale nie dla odwzorowanych obiektów. Dziękuje za odpowiadanie! +1 –

Powiązane problemy