2010-03-10 6 views
2

와 사용자 정의 개체 내가 무엇을 시도하고하면 다음과 같다 SQL 쿼리에 다음과 같이 표시되는 :LINQ 목록 <T> 재산권

var query = from t in Tests 
select new OTest 
{ 
    TestId = t.TestId 
}; 

문제는 내가 LINQ의 R없이 쿼리의 일환으로 내 주요 OTest 객체의 목록 속성으로 "하위 검사"얻을 수있는 방법이다 데이터에 대한 기본 쿼리에서 100 개의 하위 쿼리를 통합합니다.

, 나는 다음과 같이했다 경우는 매우 실용적되지 않습니다 반환되는 각 레코드에 대한 쿼리를 실행합니다 : 내 목록 속성을 얻을 수있는 방법에

var query = from t in Tests 
select new OTest 
{ 
    TestId = t.TestId, 
    SubTests = (from st in SubTests where st.TestId = t.TestId select new OSubTest{SubTestId = st.SubTestId}).ToList() 
}; 

어떤 생각이 채우기 위해를 단일 쿼리? 아마도 왼쪽 조인으로?

도움을 주시면 감사하겠습니다.

설명이 필요한 경우 저에게 문의하십시오.

편집

좋아,하지만 최대한 빨리 2 차 한 배의 데이터베이스 (100)의의를 조회하는 2 중 하나를 추가, 1 개 하위 목록이있을 때이에서 살펴 본다,이 작업을 수행합니다. 내 정확한 쿼리는 다음과 같습니다.

public List<OFile> GetFiles(int fileGroupId) 
     { 
      var query = (from f in CoreContext.Files 
         join fgf in CoreContext.FileGroupFiles on f.FileId equals fgf.FileId 
         where fgf.FileGroupId == fileGroupId 
         select new OFile 
            { 
             ActiveFile = f.ActiveFile, 
             FileExtension = f.FileType, 
             FileGuid = f.FileIdentifier, 
             FileName = f.FileName, 
             FilePath = f.FilePath, 
             FileSize = f.FileSize, 
             FileTitle = f.FileTitle, 
             RevisionId = f.RevisionId, 
             ParentFileId = f.ParentFileId, 
             FileId = f.FileId, 
             Attributes = f.FileAttributeFiles.Where(id => id.FileId == f.FileId).Select(
              id => new OFileAttribute 
                 { 
                  FileAttributeId = id.FileAttributeId, 
                  Value = id.Value 
                 }).ToList(), 
             Tags = f.FileTags.Where(id => id.FileId == f.FileId).Select(
              id => new OFileTag 
                 { 
                  FileTagId = id.FileTagId, 
                  TagName = id.TagName, 
                 }).ToList(), 


            }); 



      return query.ToList(); 
     } 

속성은 데이터베이스를 100 회 쿼리하고 JOIN으로 표시되지 않습니다.

FileAttributeFiles 테이블에는 FK와 Attributes 테이블이 있습니다.

감사

답변

3

, 나는 다음과 같이했다 경우는, 정말

음 매우 실용적되지 않습니다 반환되는 각 레코드에 대한 쿼리를 실행합니다? 너 해봤 어? 내가 TestsSubTests 있어야 할 무엇 확실하지만, 일반적으로 아니에요, SQL에 LINQ이 양식의 쿼리를 실행합니다

using (var c = new MyDataContext()) 
{ 
    var q = from t in c.Tests 
      select new 
        { 
         TestId = t.TestId, 
         SubTests = from st in t.SubTests 
            where st.TestId = t.TestId 
            select new 
            { 
             SubTestId = st.SubTestId 
            } 
        }; 
} 

을 ... 한 쿼리에서. 익명 유형 대신 POCO에 투영하는 것도 효과가 있습니다. 나는 이것을 개인적으로 사용하지 않기 때문에 ToList()을 사용하면 아무 것도 바뀌지 않을지 모르겠다. 그것 없이는 "단지 효과가있다".

+0

예, SQL 프로파일 러를 실행하여 각 레코드에 대해 하위 쿼리를 실행했습니다. 나는 내 질문을 두 번 점검하고 거기에 있으면 안되는 것이 있는지 알아볼 것입니다. – CodeLikeBeaker

+0

좋아, 하나의 하위 쿼리와 함께 작동하지만, 내가 2 때, 그것은 100 번 데이터베이스를 쿼리합니다. 내 게시물을 실제 쿼리로 업데이트했습니다. 한 번에 하나씩 개별적으로 실행하면 제대로 작동하지만 둘 다있을 때마다 특성은 항상 100 번 쿼리됩니다. 생각? – CodeLikeBeaker

+0

그런 다음 Craig의 특허 LINQ 디버깅 알고리즘 ™을 사용하십시오. 작동하는 케이스와 그렇지 않은 케이스를 가져 와서 다른 하나의 부품으로 변환하십시오. 이렇게하면 문제의 범위를 좁힐 수 있습니다. 아마도 그것은'ToList()'일까요? 그것없이 시도해 볼까요?아마도 두 개의 서브 쿼리일까요? Northwind에 대해 별도의 테스트 케이스를 사용해보십시오. 조만간 정확한 문제를 발견하게 될 것입니다. –