Up to this point in my career I have yet to reuse a Select lambda in my LINQ queries, today that changed.
I was messing around with something for a technical session within my team when I noticed I had the exact same code for 2 Select functions.
Basically I wanted to Select my DB entity type to a Domain Transfer Object type. I could've done this through some mapping or whatever but I chose this way to show off the barebones of what I was trying to show and tell at our tech session.
My code looks like this, I have a VERY basic API (that uses probably 0 best practices) that returns various information about Golf courses, scores, handicaps etc etc.
Side note, I love golf, its a great excuse to get outdoors which is probably going against the grain in a Covid fuelled world but anyways I'll keep going.
I managed to take a pretty sick photo of a tree whilst golfing at the weekend.
Where was I... ah yes the codes.
public class CourseDataIntegrationServices : ICourseDataIntegrationServices
{
private readonly GolfScoresDbContext _context;
public CourseDataIntegrationServices(GolfScoresDbContext context)
{
_context = context;
}
public List<CourseDto> GetAllCourses()
{
return _context
.Courses
.Include(x => x.Holes)
.Select(_selectCourseToCourseDto)
.ToList();
}
public CourseDto GetCourseById(Guid id)
{
return _context
.Courses
.Include(x => x.Holes)
.Select(_selectCourseToCourseDto)
.FirstOrDefault(x => x.Id == id);
}
private readonly Expression<Func<Course, CourseDto>> _selectCourseToCourseDto = (x) =>
new CourseDto
{
Holes = x.Holes.Select(h => new HolesDto
{
Name = h.Name,
HandicapIndex = h.HandicapIndex,
Par = h.Par,
Id = h.Id,
Number = h.Number,
Yardage = h.Yardage
}).OrderBy(h => h.Number).ToList(),
Id = x.Id,
Name = x.Name,
Par = x.Par
};
}
The nice thing about this is that I know have a reusable way of mapping my DB entity to my DTO without the need of a 3rd part NuGet package and tbh the code is pretty plain vanilla in terms of added sprinkles.
Expression<Func<Course, CourseDto>>
in your head can become
Expression<Func<MyInputType, MyOutputType>>
I can take the above one step further by writing a second Expression> for my Hole selection...don't be nasty.
I think I will leave that for another day.
Anyways I hope this has been of some help to those looking to create reusable select criteria for LINQ queries.
Top comments (0)