2009-04-21 2 views
8

Учитывая эту таблицу:Может ли LINQ to SQL заполнять свойства, отличные от ColumnAttribute, при использовании DataContext.ExecuteQuery?

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

это возможно для DataContext, чтобы заполнить ArbitraryText свойства при использовании ExecuteQuery метода:

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

It кажется, что алгоритм сопоставления сущности игнорирует любое свойство, не помеченное ColumnAttribute, но есть ли другой способ делая это?

Я бы предпочел, чтобы мне не пришлось делать сопоставление, но это похоже на мой единственный вариант.


Edit: Что раздражает то, что функция 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 –

Смежные вопросы