2009-04-21 48 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