Това е интригуващ въпрос. Мисля, че DTO може да ви помогне тук, но има ограничения и клопки, за които трябва да внимавате. Вземете следния пример за LINQPad:
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:
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]
Както можете да видите, не можете да използвате конструктор за копиране, за да присвоите свойствата на DTO, тъй като това принуждава целия обект да бъде изтеглен обратно от базата данни.
Това също леко ограничава, ако искате да разширите основния DTO и да добавите повече свойства за по-специализирани изгледи на данните, което означава, че можете да получите множество изрази с подобен код.
Въпреки това, аз доста харесвам вариант две, но съм сигурен, че тази опция е доста вероятно ограничена до проекции от един тип, разгледайте следния пример:
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
Не мисля, че можете да използвате израза в този тип синтаксис на заявка. Най-общо казано, не мисля, че ще има решение, което да работи навсякъде. Може да се наложи да прегледате дизайна си, за да видите дали можете да предоставите по-малко прогнози, въз основа на това, че някои от имотите са много евтини, за да се включват винаги в заявката?
Без да използвам библиотеката Dynamic LINQ или да изграждам дървото на израза ръчно, бих искал също да видя дали е възможно с LINQ-SQL/LINQ-Entities да създавам динамични селекции.
person
Hux
schedule
17.03.2012