2012-07-23 5 views
2

동적으로 열을 가져 오려고합니다. NHibernate에서 나는 이것을 할 수있다 :Linq to SQL 및 Linq to Entities 투영

var list = _session.CreateCriteria(typeof(Person)) 
        .SetProjection(Projections.ProjectionList() 
        .Add(Projections.Property("FirstName")) 
        .Add(Projections.Property("LastName")) 
        .Add(Projections.Property("Jersey")) 
        .Add(Projections.Property("FortyYard")) 
        .Add(Projections.Property("BenchReps")) 
        .Add(Projections.Property("VertJump")) 
        .Add(Projections.Property("ProShuttle")) 
        .Add(Projections.Property("LongJump")) 
        .Add(Projections.Property("PersonSchoolCollection")) 
        ) 
        .SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person))) 
        .List<Person>(); 

Linq에서 상응하는 것은 무엇인가?

답변

1
var list = from person in context.Persons 
      select new Person() 
      { 
       FirstName = person.FirstName, 
       LastName = person.LastName, 
       Jersey = person.Jersey, 
       FortyYard = person.FortyYard, 
       BenchReps = person.BenchReps, 
       VertJump = person.VertJump, 
       ProShuttle = person.ProShuttle, 
       LongJump = person.LongJump, 
       PersonSchoolCollection = person.PersonSchoolCollection 
      }; 
1

그 일하는 것이 아닌가 : 당신은 또한 를 태그로

_session.Query<Person>() 
     .Select(new {FirstName, LastName, Jersey, FortyYard}) 
     .ToList() 
     .Select(x => new Person() { 
         FirstName = x.FirstName, 
         LastName = x.LastName, 
         Jersey = x.Jersey, 
         FortyYard = x.FortyYard 
       } 
     ); 
3

난 당신이 Linq에 - 투 - SQL 또는 엔티티 프레임 워크에 해당 찾고있는 가정합니다. _session.Query<Person>()context.Persons으로 바뀌면 두 답변 (지금까지)은 동등한 것입니다. (Darius의 대답은 엔터티 쿼리에서 엔터티 인스턴스를 만들 수 없다는 예외를 던지더라도).

그러나 Select을 사용하여 임시 프로젝션을 만들 수 있다는 점을 제외하면 AutoMapper의 새로운 기능 중 하나가 더 쉽게 사용할 수 있습니다. Automapper는 형식 목록을 다른 유형 목록에 매핑 (말하기 : 프로젝트)하는 매우 인기있는 도구입니다. 그러나 최근까지는 메모리 내 목록에서만 작동한다는 단점이있었습니다. 즉, 투영이 SQL 쿼리로 전파되지 않았습니다. 따라서 NHibernate 투영과 같이 질의 된 필드의 수를 줄이는 데 사용할 수 없습니다.

이 문제는 Stop using AutoMapper in your Data Access Code (제목에는 모두 표시)에 설명되어 있습니다. 그러나 그것은 예비지만 훌륭한 수정을 제안했는데, Automapper가 나중에 채택했습니다.

이 기능

은 가능한 매우 간결 코드를 작성 할 수 있습니다와 같은 :

var dtoList = context.Persons.Project().To<PersonDto>(); 

(사람과 PersonDto 사이의 매핑이 Automapper에 등록 된 후).

이제 SQL 쿼리에는 PersonDto에 사용되는 필드 만 포함됩니다.