Учитывая эту таблицу:Может ли 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).
Это очень хорошая идея! Тем не менее, мы очень стараемся не иметь каких-либо хранимых процедур, так как их сохранение - это общая PITA. Это либо LINQ-only, либо параметризованный SQL (как в данном случае). Я просто не понимаю, как DataContext работает так, как ожидалось, на объектах, которые не имеют атрибутов System.Data.Linq.Mappings, но не для сопоставленных объектов. Спасибо, что ответили! +1 –