2010-04-09 4 views
1

LINQ to SQL 투영 형에서 반복의 일부를 취하는 방법이 있는지 궁금합니다.LinqToSql : 어떻게하면 DRY를 준수 할 프로젝션을 만들 수 있습니까?

예 :

테이블 : 주소

분야 : AddressID, HouseNumber, 거리,시, 주, 우편 번호, 20 개

클래스 MyAddress : AddressID, HouseNumber , 스트리트 (필드 3 개만 해당)

LINQ :

 
from a in db.Addresses 
select new MyAddress 
{ 
    AddressID = a.AddressID, 
    HouseNumber = a.HouseNumber, 
    Street = a.Street 
} 

위의 쿼리는 완벽하게 작동하고,이 같은 각 행의 모든 ​​20 개 이상의 필드를 반환합니다 내가 왜 이해 :

인가 : 내 질문에 날 리드

 
from a in db.Addresses 
select new MyAddress(a); 

class MyAddress 
{ 
    public MyAddress(Address a) 
    { 
    this.AddressID = a.AddressID, 
    this.HouseNumber = a.HouseNumber, 
    this.Street = a.Street 
    } 
} 

LINQ 모델에서 MyAddress로 "매핑"하는 헬퍼 함수 또는 확장 메서드를 구현할 수 있지만 모든 필드가 아닌 쿼리 결과에서 필요한 필드 만 반환 할 수 있습니까?

+0

왜 축소 된 데이터 형식이 필요한가요? –

+0

20-30-40 개의 필드를 가진 테이블로 작업하고 있는데 3 개 만 필요하거나 원할 경우 SQL이 작업을 수행하고 와이어를 통해 여분의 데이터를 모두 반환해야하는 이유는 무엇입니까? – Mike

답변

2
from a in db.Addresses 
select new MyAddress 
{ 
    AddressID = a.AddressID, 
    HouseNumber = a.HouseNumber, 
    Street = a.Street 
} 

해당 쿼리는 결과 SQL에서 요청 된 필드 만 선택합니다.

모양을 유형을 다시 사용하는 기능입니다 :

public IQueryable<MyAddress> ProjectAddress(IQueryable<Address> addresses) 
{ 
    return from a in addresses 
      select new MyAddress 
      { 
       AddressID = a.AddressID, 
       HouseNumber = a.HouseNumber, 
       Street = a.Street 
      }; 
} 

이이처럼 사용할 수 있습니다 :

public static Expression<Func<Address, MyAddress>> ToMyAddress() 
{ 
    return a => new MyAddress { AddressID = a.AddressID, 
           HouseNumber = a.HouseNumber, 
           Street = a.Street 
           }; 
} 
:
return ProjectAddress(db.Addresses); 

내가 함수가 같을 것이라고 생각
+0

반환 유형으로 키가 IQueryable 인 것으로 나타 났습니까? 단일 주소는 어때요? 두 개의 속성을 가진 개체가 있습니다 : OriginalAddress 및 CurrentAddress, 둘 다 형식 주소. "도메인 모델"을 받아들이고 "뷰 모델"을 뱉어내는 도우미 함수를 만들 수 있습니까? 내가 시도하는 모든 것이 데이터베이스에서 전체 레코드를 가져 오는 것을 끝냅니다. 너무 많이 리팩터링하려고합니까? – Mike

+0

IQueryable을 사용하면 linq이 빌드 될 수있는 식으로 남아있게되며 나중에 쿼리로 확인되어 실행됩니다. 나는 여러분이 달성하고자하는 것을 이해하고 있다고 생각합니다 : 주소 엔티티의 투영을 주소보기 모델에 코드로 표현하고, 다른 프로젝션에서 함수 호출과 같은 것을 여러 번 사용하십시오. 그게 맞습니까? – SteadyEddi

+0

핵심은 동적 linq를 사용하고 변환을 나타내는 표현식을 작성하는 것입니다. IMHO 결과 코드는 표현식과 메타 프로그래밍을 익숙하지 않은 사람에게는 상당히 복잡해 보일 것이라고 나는 말할 것이다. 그것은 확실히 DRY 가치를 증가시킬 것입니다. 나는 심판의 전화를하고 상당한 수의 장소에서 코드를 반복하고 있다고 말하면 코드를 변경하면 상당한 시간이 걸릴 것입니다. – SteadyEddi

관련 문제