2012-06-20 3 views
0

가능한 중복 :내 Linq 문에서 "이 명령과 관련된 열려있는 DataReader가 먼저 닫아야합니다"문제를 해결하는 방법은 무엇입니까?

public class VwSelectBrochures 
{ 
    public List<SelectBrochure> SelectBrochures { get; set; } 
} 

    public class SelectBrochure 
{ 
    public int BrochureId { get; set; } 
    public string UrlImage { get; set; } 
    public string Description { get; set; } 
    public string Cat1Description { get; set; } 
    public string Cat2Description { get; set; } 
    public string Cat3Description { get; set; } 
    public List<LangSelection> Languages { get; set; } 
} 

public class LangSelection 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public bool Vink { get; set; } 
} 

및 코드 줄 :

var dbmodel2 = 
from x in 
    brochures.AsEnumerable().Select(
     x => new SelectBrochure {BrochureId = x.Id, Description = x.Description, UrlImage = x.UrlImage, 
     Languages = new List<LangSelection>(from y in x.BrochureLanguages select new LangSelection(){Description = y.Language.Description, Id = y.Language.Id})}) 
select x; 

브로
Entity Framework: There is already an open DataReader associated with this Command

나는이 수업을 chure 및 BrochureLanguages는 db-models입니다.

"y에서 x.BrochureLanguages"를 수행 할 수 없기 때문에 오류가 발생하지만이 문제를 해결할 수있는 방법이 없습니다.

내가 정말로 원하는 것은 모든 소책자를 VwSelectBrochures 클래스에 넣는 것이다.

+0

이 문장 앞에 List 을 선언하고 작성한 다음 ToList()를 실행하면 각 새 SelectBrochure에 대해 해당 목록의 ToList()가 실행됩니다. ** 그 문제에 대해서는 위의 배열로 선언하고 모든 새로운 객체에 대해 배열에 .ToList()를 발행하면됩니다. –

답변

0

가장 쉬운 방법은 첫 번째 (ToList() 사용) 메모리에 전체 brochures을 가지고 있습니다 :

var dbmodel2 = 
from x in 
    brochures.ToList().Select(
     x => new SelectBrochure {BrochureId = x.Id, Description = x.Description, UrlImage = x.UrlImage, 
     Languages = new List<LangSelection>(from y in x.BrochureLanguages select new LangSelection(){Description = y.Language.Description, Id = y.Language.Id})}) 
select x; 

이 방법 from y in ...를 실행 열린 다른 DataReader를가 없습니다. 나는 다른 옵션이 join을 사용하고 있다고 생각합니다.

+0

당신, 선생님, 환상적입니다! 나는 그것을 발견 했어야했다. –

+0

@jurgen_be 문제가 해결되면 답변을 수락 해주세요. 자세한 내용은 [faq] (http://stackoverflow.com/faq#howtoask)를 참조하십시오. –

2

아키텍처 수정을 권장하기에는 정보가 너무 적지 만 연결 문자열에 MARS을 사용하는 것이 좋습니다.

0

쿼리식이 약간 확실하지 않으며 결과를 얻기 위해 내부 확장 메서드를 개인적으로 선호합니다. 죄송합니다.이 대답은 쿼리 식 형식이 아니지만 시도해 볼 수 있습니까?

var dbmodel2 = brochures.AsEnumerable().Select(x => new SelectBrochure { 
     BrochureId = x.Id, 
     Description = x.Description, 
     UrlImage = x.UrlImage, 
     Languages = x.BrochureLanguages.Select(y => new LangSelection() { 
      Description = y.Language.Description, 
      Id = y.Language.Id 
     }) 
    }).ToList(); // this executes the whole query 

는 다시, 쿼리 식 형식 약 100 % 확신되지 않는, 내가 불필요한이었다 "에 ... 선택 X X에서"바깥을 느꼈다 그 오류의 원인이 될 수있는 경우 궁금.

+0

간단한 적응은 완벽하게 작동했습니다. "브로셔"다음에 ToList를 추가하십시오. 및 y.Language.ID}와 동일합니다.) ToList() –

관련 문제