저는 오늘 처음으로 Expression>을 사용하여 재사용 가능한 LINQ 쿼리를 만들었습니다.

7315 단어 csharp
내 경력에서 지금까지 나는 LINQ 쿼리에서 Select lambda를 재사용하지 않았습니다. 오늘 변경되었습니다.

2개의 선택 기능에 대해 정확히 동일한 코드가 있음을 알았을 때 팀 내 기술 세션을 위해 무언가를 엉망으로 만들었습니다.

기본적으로 DB 엔터티 유형을 도메인 전송 개체 유형으로 선택하고 싶었습니다. 일부 매핑 등을 통해 이 작업을 수행할 수 있었지만 기술 세션에서 보여주고 전달하려는 기본 사항을 과시하기 위해 이 방법을 선택했습니다.

내 코드는 다음과 같습니다. 골프 코스, 점수, 핸디캡 등에 대한 다양한 정보를 반환하는 매우 기본적인 API(아마도 0개의 모범 사례를 사용함)가 있습니다.

여담으로, 저는 골프를 좋아합니다. 야외 활동을 할 수 있는 좋은 변명이 될 수 있습니다. 아마도 Covid가 연료를 공급하는 세상에서 흐름에 역행할 것입니다. 하지만 어쨌든 저는 계속 갈 것입니다.



나는 주말에 골프를 치는 동안 나무의 꽤 아픈 사진을 찍을 수 있었습니다.



내가 어디 있었지... 아 네, 코드들.


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
            };
    }



이것에 대한 좋은 점은 세 번째 부분 NuGet 패키지가 필요 없이 내 DB 엔터티를 내 DTO에 매핑하는 재사용 가능한 방법이 있다는 것입니다.
Expression<Func<Course, CourseDto>> 당신의 머리에 될 수 있습니다Expression<Func<MyInputType, MyOutputType>>
내 구멍 선택에 대해 두 번째 Expression>을 작성하여 위의 한 단계 더 나아갈 수 있습니다.

나는 그것을 다른 날에 남겨 둘 것이라고 생각합니다.

어쨌든 이것이 LINQ 쿼리에 대한 재사용 가능한 선택 기준을 만들려는 사람들에게 도움이 되었기를 바랍니다.

좋은 웹페이지 즐겨찾기