Questa è una domanda interessante. Penso che un DTO possa aiutarti, ma ci sono limitazioni e insidie a cui prestare attenzione. Prendiamo il seguente LINQPad Esempio:
class ProjectDTO
{
public string Name { get; set; }
public static Expression<Func<Project, ProjectDTO>> ToDTO = (e) => new ProjectDTO
{
Name = e.Name
};
public ProjectDTO() {}
public ProjectDTO(Project project)
{
Name = project.Name;
}
}
void Main()
{
Projects.Select(p => p.Name).Dump();
Projects.Select(ProjectDTO.ToDTO).Dump();
Projects.Select(p => new ProjectDTO(p)).Dump();
}
SQL generato:
SELECT [t0].[Name]
FROM [Project] AS [t0]
GO
SELECT [t0].[Name]
FROM [Project] AS [t0]
GO
SELECT [t0].[ProjectId], [t0].[Name], [t0].[Description], [t0].[DateCreated], [t0].[DateModified], [t0].[DateComplete], [t0].[CreatedBy]
FROM [Project] AS [t0]
Come si può vedere, non è possibile utilizzare un costruttore di copia per assegnare le proprietà del DTO come questo forza l'intero oggetto essere ritirato dal database.
Anche questo leggermente limitativo se si desidera estendere il DTO di base e aggiungere ulteriori proprietà per visualizzazioni più specializzate dei dati, il che significa che si potrebbe finire con più espressioni con codice simile.
Tuttavia, mi piace molto l'opzione due, ma sono sicuro che questa opzione è molto probabile limitato a proiezioni di tipo singolo, si consideri il seguente esempio:
var query = from p in Projects
join t in Tasks on p.ProjectId equals t.ProjectId
select ProjectDTO.ToDTO; //Can't be used like this
Non credo che è possibile utilizzare l'espressione in questo tipo di sintassi di query. In generale, non penso che ci sarà una soluzione che funziona a tutto campo. Potrebbe essere necessario rivedere il progetto per vedere se è possibile fornire meno proiezioni, in base ad alcune delle proprietà che sono molto economiche da includere sempre nella query?
Senza usare la libreria Dynamic LINQ o costruendo manualmente l'albero delle espressioni, mi piacerebbe anche vedere se è possibile con LINQ-SQL/LINQ-Entities creare selezioni dinamiche.
Qualcosa di simile? http://stackoverflow.com/questions/1299534 –
@Robert: quell'esempio sembra provare a scrivere un sostituto di Where, che è leggermente diverso. Ma potrei mancare qualcosa. Grazie comunque. –
C'è anche questo: http://stackoverflow.com/questions/4683427, che potrebbe essere un po 'più vicino a quello che stai cercando di fare. –