2009-04-21 18 views
8

Với bảng này:LINQ to SQL có thể điền vào các thuộc tính không được đánh dấu thuộc tính ColumnAttribute khi sử dụng DataContext.ExecuteQuery không?

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

Với lớp mô hình này:

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

Có thể cho một DataContext để lấp đầy ArbitraryText tài sản khi sử dụng ExecuteQuery phương pháp:

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

Nó có vẻ như thuật toán ánh xạ thực thể bỏ qua bất kỳ thuộc tính nào không được đánh dấu bằng ColumnAttribute, nhưng có cách khác làm điều này?

Tôi không muốn tự mình vẽ bản đồ, nhưng điều này có vẻ như là lựa chọn duy nhất của tôi.


Edit: Có gì khó chịu là chức năng DataContext.ExecuteQuery sẽ điền vào một đối tượng POCO từ một truy vấn:

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

Vì vậy, giải pháp hiện tại của tôi là phải có một lớp bên trên đối tượng LINQ-ánh xạ của tôi rằng giữ dữ liệu bổ sung mà truy vấn tổng hợp của tôi trả về. Điều này là phụ tối ưu, vì một số thuộc tính được nhân bản (ví dụ, Id và Văn bản).

Trả lời

2

Không xa như tôi biết. Bạn có thể có thể làm một số điều mang tính chất grungy để kết hôn dữ liệu từ một UDF, có lẽ - nhưng khác hơn thế, nó sẽ muốn có khả năng ánh xạ các cột.

(nơi UDF chỉ trả về văn bản tùy ý và nhận xét-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; 

Ngoài ra - Một khi tôi đã viết một few variants on ExecuteQuery có thể hữu ích nếu bạn cần phải sử dụng phương pháp này cho rất nhiều thứ khác nhau ... Cá nhân, có lẽ tôi sẽ cố gắng giải quyết vấn đề này trước.

+0

Đây là một ý tưởng rất hay! Tuy nhiên, chúng tôi cố gắng hết sức để không có bất kỳ procs được lưu trữ nào, vì việc duy trì chúng là tổng PITA. Đó là chỉ LINQ hoặc SQL được tham số hóa (như trường hợp ở đây). Tôi chỉ không hiểu cách DataContext hoạt động như mong đợi trên các đối tượng không có thuộc tính System.Data.Linq.Mappings, nhưng không cho các đối tượng được ánh xạ. Cảm ơn vì đã trả lời! +1 –

Các vấn đề liên quan