给定此表:
CREATE TABLE [Comments]
(
[Id] [int] IDENTITY(1, 1) NOT NULL,
[Text] [nvarchar](600) NOT NULL
)
使用此模型类:
[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; }
}
使用
ArbitraryText
方法时,DataContext是否可以填充ExecuteQuery
属性:var comments = db.ExecuteQuery<Comment>("select Id, [Text], 'hello' [ArbitraryText] from Comments");
似乎实体映射算法会忽略未标记为
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)。
最佳答案
据我所知。您也许可以做一些卑鄙的事情,以将UDF中的数据与-结合起来,但除此之外,它还希望能够映射列。
(UDF仅返回任意文本和comment-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
,如果您需要将这种方法用于许多不同的事情,这可能会很有用...不过,就我个人而言,我可能会首先尝试回避此问题。关于c# - 使用DataContext.ExecuteQuery时,LINQ to SQL可以填充非ColumnAttribute标记的属性吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/771491/