EntityFramework와 Linq 에서 select 시, Model 객체로 받아 저장가능한가요?

안녕하세요. 제목과 같이
EntityFramework와 Linq 에서 select 시, Model 객체로 받아 저장하고자 합니다.

현재 C# 언어로 WPF 프로젝트를 만들어서
닷넷 프레임워크 4.8.1 + SQLite + EntityFramework 6.4.4 + Linq 기반으로 개발 진행중입니다.

EntityFramework 사용을 위해 테이블 스키마대로 Model 생성을 했습니다.

이 Model에 각 컬럼의 프로퍼티들이 있기에, 해당 Model 들을 몇몇 이유로 활용할겸 select 후에 Model 로 저장해서 받아오고자 했습니다.
하지만 그 방법을 몰라 문의 드립니다.

여러가지 서치를 통해서 방법을 확인해 보았습니다.

방법1) select 한 이후 리스트에 담긴걸 다시한번 select 하여 Model 에 저장.
아래와 같은 방법으로는 가능하나, 두번 select 하는 과정이 있어 비 효율적입니다.

var patternList = _dbContext.MST_REF_COMMAND
.Where(mrc => mrc.Log_file_seq == 18
&& mrc.Sanitizing_target == 2
&& mrc.Del_flg == “N”)
.Select(mrc => new // 익명 형식 사용
{
Seq = mrc.Seq,

})
.ToList()
.Select(x => new MstRefCommandModel
{
Seq = x.Seq,
})
.ToList();

**방법2) Runtime 시 **
System.NotSupportedException: The entity or complex type ‘LogSanitizer.Common.Database.MST_REF_COMMAND’ cannot be constructed in a LINQ to Entities query.
에러가 발생

var patternList = _dbContext.MST_REF_COMMAND
.Where(mrc => mrc.Log_file_seq == 18
&& mrc.Sanitizing_target == 2
&& mrc.Del_flg == “N”)
.Select(mrc => new MstRefCommandModel
{
Seq = mrc.Seq,
// 나머지 필드들을 필요에 따라 추가
})
.ToList();

select 시 테이블 스키마대로 Model에 담아서 리스트형으로 반환하고 싶은데요.
혹시 방법을 알고 계시면 공유좀 부탁드립니다.

감사합니다.

객체를 생성하고 복사하는 오버헤드가 우려하시는 만큼 크지 않습니다.
CPU 사양이나 속성 개수에 따라 다르겠지만 10개 정도 속성을 가지는 형식의 인스턴스를 1만개 생성 할 때 1~2ms 수준이며 릴리즈 빌드 시에는 더 빠릅니다.
아마 객체 생성 오버헤드가 복사 오버헤드보다 더 클 것이며, 결과를 원하는 형식으로 직접 반환한다고 했을 때, 익명 객체를 생성하는 시간이 빠지지만 대상 형식의 객체를 생성하는 시간은 동일하므로 큰 차이는 없을 것으로 보입니다.
일반적으로 사용되는 Mapper 라이브러리들도 Projection 된 결과에 대해 내부적으로 이러한 과정을 거치므로 마찬가지겠죠.

저의 경우 이 정도의 오버헤드라면 GUI 업데이트를 한 번 덜 하는 방향 등의 최적화를 고민할 것 같습니다.

1 Like

모델을 받고, 모델의 속성을 참조하면 되지 않을까요?

var mrcList = _dbContext.MST_REF_COMMAND
   .Where(mrc => mrc.Log_file_seq == 18
   && mrc.Sanitizing_target == 2
   && mrc.Del_flg == “N”)
   .ToList() 

var seqList = mrcList.Select(mrc => mrc.Seq);
1 Like