Biorąc poniższej tabeli:Czy LINQ do SQL może wypełnić właściwości oznaczone znacznikiem innym niż ColumnAttribute podczas korzystania z DataContext.ExecuteQuery?
CREATE TABLE [Comments]
(
[Id] [int] IDENTITY(1, 1) NOT NULL,
[Text] [nvarchar](600) NOT NULL
)
z tym modelem klasy:
[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; }
}
Czy to możliwe, że DataContext wypełnić właściwość ArbitraryText
przy użyciu metody ExecuteQuery
:
var comments = db.ExecuteQuery<Comment>("select Id, [Text], 'hello' [ArbitraryText] from Comments");
It wydaje się, że algorytm mapowania encji ignoruje każdą właściwość nie oznaczoną ColumnAttribute
, ale czy istnieje inny sposób robiąc to?
Ja wolałbym nie robić tego mapowania, ale to wygląda na jedyną opcję.
Edycja: Co jest irytujące jest to, że funkcja DataContext.ExecuteQuery wypełni POCO obiektu z kwerendy:
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]...
Więc mój obecny rozwiązaniem jest mieć wewnętrzną klasę na moim LINQ odwzorowany obiektu przechowuje dodatkowe dane, które zwraca moje zagregowane zapytanie. Jest to nieoptymalne, ponieważ niektóre właściwości są duplikowane (na przykład Id i tekst).
To bardzo dobry pomysł! Staramy się jednak nie mieć żadnych zapisanych proców, ponieważ ich utrzymanie jest całkowitą PITA. Jest to albo LINQ albo sparametryzowany SQL (jak w tym przypadku). Po prostu nie rozumiem, jak DataContext działa zgodnie z oczekiwaniami na obiektach, które nie mają atrybutów System.Data.Linq.Mappings, ale nie dla odwzorowanych obiektów. Dziękuje za odpowiadanie! +1 –