2009-04-21 49 views
8

對於這個表:使用DataContext.ExecuteQuery時,LINQ to SQL是否可以填充非ColumnAttribute標記的屬性?

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

有了這個模型類:

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

它:

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

是否有可能爲一個DataContext使用ExecuteQuery方法時填寫ArbitraryText財產似乎實體映射算法忽略任何未標記爲ColumnAttribute的屬性,但是有沒有另一種方法這樣做?

我寧願不必自己做映射,但這看起來像我唯一的選擇。


編輯:什麼是惱人的是,DataContext.ExecuteQuery功能會從查詢填充 POCO對象:

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

所以我目前的解決方案是讓我的LINQ映射對象的內部類保存我的聚合查詢返回的額外數據。這是次優的,因爲有些屬性是重複的(例如,Id和Text)。

回答

2

據我所知。也許你可能會做一些蹩腳的事情來結合UDF的數據 - 但除此之外,它會希望能夠映射列。

(其中UDF僅返回任意文本和註釋-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; 

或者 - 如果你需要使用這種方法爲許多不同的事情,可能是有用的一個,而我寫了一個few variants on ExecuteQuery ......就我個人而言,我可能會首先試圖解決這個問題。

+0

這是一個非常好的主意!然而,我們非常努力地沒有任何存儲過程,因爲維護它們是一個總PITA。它不是LINQ-only就是參數化的SQL(這裏就是這種情況)。我只是不理解DataContext如何在沒有System.Data.Linq.Mappings屬性的對象上工作,但不能用於映射對象。謝謝你的回答! +1 – 2009-04-22 03:09:51