Jest to intrygujące pytanie. Myślę, że DTO może ci pomóc, ale istnieją ograniczenia i pułapki, na które trzeba uważać. Podjąć następujące LINQPad Przykład:
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 generowane:
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]
Jak widać, nie można korzystać z kopiowaniem konstruktora przypisać właściwości DTO jak to zmusza cały obiekt do pobrania z bazy danych.
To również nieznacznie ograniczające, jeśli chcesz rozszerzyć podstawowy DTO i dodać więcej właściwości dla bardziej wyspecjalizowanych widoków danych, co oznacza, że możesz otrzymać wiele Wyrażeń z podobnym kodem.
Jednak Lubię Opcja druga, ale jestem pewien, że ta opcja jest całkiem prawdopodobne, ograniczone do pojedynczych prognoz typu Rozważmy następujący przykład:
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
I nie sądzę, można użyć wyrażenia w tego typu składni zapytania. Ogólnie rzecz biorąc, nie wydaje mi się, aby istniało rozwiązanie, które będzie działać we wszystkich obszarach. Być może trzeba będzie przejrzeć swój projekt, aby sprawdzić, czy można przewidzieć mniej prognoz, na podstawie niektórych właściwości są bardzo tanie, aby zawsze uwzględnić w zapytaniu?
Bez użycia biblioteki Dynamic LINQ lub ręcznego budowania drzewa ekspresji chciałbym również sprawdzić, czy jest możliwe, aby LINQ-SQL/LINQ-Entities tworzyły dynamiczne selekcje.
Coś takiego? http://stackoverflow.com/questions/1299534 –
@Robert - ten przykład wydaje się próbować napisać zamiennik dla Where, który jest nieco inny. Ale mógłbym czegoś nie zauważyć. Ale dziękuję. –
Istnieje również: http://stackoverflow.com/questions/4683427, który może być nieco bliżej tego, co próbujesz zrobić. –