2011-08-01 6 views
12

라고 :"새로운"은 내가 간단한 Linq2Sql 쿼리를하면

var result = from t in MyContext.MyItems 
      select new MyViewModelClass() 
      { 
       FirstProperty = t, 
       SecondProperty = new SomeLinq2SqlEntity() 
      }  

문제는 new SomeLinq2SqlEntity()가에, 순서에 대해 한 번만 MyViewModelClass 그렇게 모든 인스턴스를 실행하는 것 같다 것입니다 쿼리의 결과는 하나의 객체에 대한 링크를 공유합니다.

업데이트 : 여기 내가 빨리 확인하는 방법입니다

result[0].SecondProperty.MyField = 10; 

사용 디버거 나는 MyField이 모든 경우에 10로 설정되어 있음을 확인할 수 있습니다. 내가 foreach 문에 LINQ 쿼리를 교체 할 때

, 그것은 예상대로 작동 : 나는 문제의 근본을 발견하지 않은,하지만 asnwer 좋은 해결 방법을 제공하기 때문에 포스트가 표시

var result = from t in MyContext.MyItems select t; 
    var list = new List<MyViewModelClass>(); 
    foreach (var item in result) 
    { 
     list.add(new MyViewModelClass() 
      { 
       FirstProperty = item, 
       SecondProperty = new SomeLinq2SqlEntity() 
      });  
    } 

. 자세한 설명은 다음을 참조하십시오. "new" inside concrete type projection is only called once

+0

당신이 그것을 인스턴스화 한 번만 실행됩니다 _seems_ 말한다. 이걸 어떻게 확인 했니? 하나의 속성을 변경하여 모든 투영 된 객체에 반영된 값을 보려고 했습니까? 아니면 하나의 객체 만 나중에 영구적으로 유지 되었기 때문에 그럴 수 있습니다. –

+0

"업데이트"섹션에 빠른 테스트를 추가했습니다. – artvolk

+0

이것은 linq에서 sql과 관련이 있습니다. linq에서 linq로 완전히 비슷한 예제가 있습니다. var v = "abc".Select (C => new ObjectContainer() {o = new SomeClass()}); 'SomeClass' 매개 변수가 예상 된 ** 3 ** 번 호출됩니다 – AakashM

답변

2

SomeLinq2SqlEntity 개체를 linq과 함께 개체에 추가하여 사용 해본 적이 있습니까?

var result = (from t in MyContext.MyItems 
      select new 
      { 
       FirstProperty = t 
      }) 
      .AsEnumerable() 
      .Select(t => new MyViewModelClass() 
      { 
       FirstProperty = t.FirstProperty , 
       SecondProperty = new SomeLinq2SqlEntity(); 
      }); 
+0

감사합니다. 개념적으로 이것은'foreach' 해결책과 같은 것으로 보이는데, 나는 나의 첫 시도가 똑같이 행동 할 것이라는 것을 완전히 확신했다. 왜 작동하지 않는지 이해가 안 돼요. 어떤 아이디어라도? – artvolk

4

아마 공급자의 이상한 IQueryable 구현 할 수있는 뭔가가. Aducci의 대답은 AsEnumerable() 호출로 데이터베이스에서 데이터를 추출하고 해당 집합에 대한 쿼리를 수행합니다. 이는 IQueryable과 다른 것입니다. IEnumerable을가 Func를 받아 사용자가 예상하는대로 그것을 수행하는 예를 IQueryable를 들어

는 나중에 (즉, 한 번 최적화를위한 코드를 공유 실행) 콘크리트 공급 업체에 따라 구문 분석 ExpressionTree을 구축합니다.

여기에서 자세한 내용을보실 수 있습니다 :

http://msdn.microsoft.com/en-us/vcsharp/ff963710

+0

.NET 4.0에서 기본 LINQ2SQL MS SQL 공급자를 사용하고 있습니다. 이것은 (잘 알려진) 버그입니까? – artvolk

+0

잘 모르겠지만, afaik Linq2Sql은 약간 구형이며 단종되어 있으므로 Entity Framework를 사용하는 것이 더 나을 것입니다. – Grozz

+0

아직 지원됩니다 (하지만 새로운 기능은없는 것 같습니다). 문제의 응용 프로그램은 오래 전에 EF가 오늘날과 같이 좋지 않을 때 시작되었습니다. – artvolk