2010-03-05 1 views
3

내 MVC 응용 프로그램에 대한 내 서비스 계층에서 linq를 SQL 엔터티 결과로 변환하여 비즈니스 모델 엔터티로 변환하려고합니다.IList에 반환 할 수 있습니까 <T>?

public IList<Project> GetAllProjects() 
    { 
     var results = from p in _context.Repository<DBMappings.project>() 
         select p; 

     foreach (DBMappings.project prj in results.ToList<DBMappings.project>()) 
      yield return CreateProjectEntityFromDBProject(prj); 

    } 

불행하게도,이 작동하지 않는 것 내가 추측 할 수있는 유일한 것은 그 수율은 IEnumerable을 작동입니다 : 저는 현재 다음 코드를 시도하고있다. foreach 루프에 항목을 추가하고 목록을 반환하면서 새 목록을 만드는 것 외에 다른 해결책이 있습니까? 반환 된 목록을 사용하는 메서드는 .Sort()와 같은 List Methods를 수행 할 수 있어야하므로 IList를 사용해야합니다.

답변

7

List<T>을 반환 메서드에서 목록을 확실히 만들어야합니다. 결과는 단일 객체로 저장되지 않으므로 yield를 사용하면 메모리를 절약 할 수 있습니다. 결과를 건너 뛰고 싶을 때 유용합니다. 그러나 당신이 원하는 것을 정렬하고자한다면 당신은 그것을 메모리에 하나의 조각으로 필요로합니다. 는 C# 사양

+0

한 .. –

+0

그건 의미가있어, 고마워요 :) – KallDrexx

+0

내게 수익률에 대한 일반적인 조언을 해주지. 현재 작업에 유용하다는 것을 확실히 알고있을 때 사용하십시오. 의심하지 않으면 사용하지 마십시오. :) – Andrey

1

IList<T>은 최소한 지연로드가 진행되는 한 IEnumerable<T>과 호환되지 않는 기능을 설명합니다.

특정 인덱스 a la IList<T>에 갈 수 있으므로 적어도 전체 지정된 열거 형을 '열거'해야합니다.

는 전체 IEnumerable<T>의 평가에 대해 걱정하지 않는 경우, 당신은 List<T> 생성자 매개 변수로 IEnumerable<T>을 복용 구성 할 수 있습니다, 당신은 당신을 .Sort()하려면 다음 IList<T>

2

섹션 8.14 (강조 광산)

수율 문 (§8.2)에 열거 객체 (§10.14에 값 을 수득하는 반복기 블록에서 사용된다. 4) 또는 이터레이터의 열거 가능 객체 (§10.14.5)를 반복하거나, 또는 반복의 끝을 알리는 것입니다.

IList는 IEnumerable을 구현하지만 IEnumerator는 구현하지 않습니다.

+0

아, 내 혼란의 일부를 설명합니다. IEnumerator가 있다는 것을 깨닫지 못했습니다. IEnumable 일 뿐이라고 생각했습니다. – KallDrexx

2

당신은 할 수 없습니다 "게으른 반환"목록,하지만 당신은 당신이 원하는 것을 얻을 수있는 것 같다 : 정렬에 대한 의견을

return results.Select(prj=>CreateProjectEntityFromDBProject(prj)).ToList(); 

하거나

var results = from p in _context.Repository<DBMappings.project>() 
        select CreateProjectEntityFromDBProject(p); 
return results.ToList(); 
+0

아, 좋은 생각입니다! 내가 그 중 하나를 할 수 있다는 것을 깨닫지 못했습니다. – KallDrexx

+0

다른 Linq가 일반적인 C#에서 어떻게 보이는지, C#이 여전히 거기 있다는 사실을 잊기 쉽습니다 ... – JasonTrue

관련 문제