2016-06-13 3 views
1

다음과 비슷한 쿼리가 있습니다. 실제 쿼리에는 이와 같은 세 섹션이 있고 그 다음에 Concat이 포함되어 있으며 일부 추가 필터와 정렬이 적용됩니다.중첩 된 쿼리가 지원되지 않습니다.

var articles = from p in Repository.Query<Product>() 
       let article = p.Article 
       let office = p.TariffCategory.Office 
       where p.IsDeleted == false 
       select new 
       { 
        OfficeId = office.Id, 
        Office = office.Name, 
        Category = p.TariffCategory.Description, 
        ArticleId = article.Id, 
        Article = article.Title, 
        Destinations = p.ProductDestinations.Select(d => new { Id = d.DestinationId, Name = d.Destination.Description }), 
        GlobalDestinations = p.AllDestinationsInOffice, 
        article.LastReviewedDate, 
        article.CreatedDate, 
        article.CreatedByEmployee 
       }; 

나의 할당이 Destinations 인 경우를 제외하고 모든 것이 옳은 것처럼 보입니다. 그 행은 다음 오류를 생성합니다.

중첩 쿼리는 지원되지 않습니다. Operation1 = 'UnionAll'Operation2 = 'MultiStreamNest'

해당 줄을 제거하면 모든 것이 예상대로 작동합니다. 이와 같은 쿼리를 수행 할 수있는 방법이 있습니까?

+0

다른 두 쿼리 중 하나의 출력이 오류를 표시하는 행의 개체 중 하나와 같은 이름 인 것 같습니다. – jdweng

+0

@jdweng : 어느 출력이 동일합니까? –

+0

대상이 코드에서 다른 곳을 정의합니까? 어쩌면 클래스 이름 일 수도 있습니다. 아마 설명은 코드의 다른 곳에서 사용됩니다. – jdweng

답변

1

내가 제안한 것처럼 조인을하는 것보다 약간의 생각이 들었습니다. ProductDestination에서 쿼리를 시작하는 것이 좋습니다. 우리가 관심을 갖는 부분은 일반 SQL 쿼리를 통해 볼 수있는 것과 마찬가지로 각 제품 + 대상 조합에 대한 행입니다. 우리가있어 일단 우리는 당신이

var data = Repository.Query<ProductDestination>() 
    .Where(pd => !pd.Product.IsDeleted) 
    .Select(pd => 
    new { 
     Product = pd.Product, 
     Destination = pd.Destination, 
    }) 
    .GroupBy(pd => pd.Product) 
    //I'm not in a position to test if EF will successfully run the below, so .ToList() 
    //May not be required. However, the bulk of the work is done in the database, anyway. 
    //.ToList() 
    .Select(g => new { 
     OfficeId = g.Key.TariffCategory.Office.Id, 
     Office = g.Key.TariffCategory.Office.Name, 
     Category = g.Key.TariffCategory.Description, 
     ArticleId = g.Key.Article.Id, 
     Article = g.Key.Article.Title, 
     Destinations = g.Select(gg => new { Id = gg.Destination.DestinationId, Name = gg.Destination.Description }), 
     GlobalDestinations = g.Key.AllDestinationsInOffice, 
     g.Key.Article.LastReviewedDate, 
     g.Key.Article.CreatedDate, 
     g.Key.Article.CreatedByEmployee 
    }); 

있었다 표현에 더 가까운 것, 그래서 우리는 내가 위의 는하지만 난 ToList()없이 작업 '을해야 확실 해요 결과에 그룹화 적용 할 수 있습니다 100 % 확신 할 수 없다. 그러나, 언급 한 바와 같이, 작업의 대부분은 데이터베이스에서 이루어 지므로 최종 프로젝션이 메모리에서 완료 되더라도 너무 집중적이어서는 안됩니다. 그러나 ToList()이 필요한 경우 Key을 통해 선택한 모든 필드를 반환하도록 GroupBy을 수정해야합니다. 그렇지 않으면 지연로드 및 N + 1 쿼리에 문제가 발생합니다.

+0

그것은 작동하는 것, 감사합니다. 나는'GroupBy'를 사용하여 참고 문헌을 찾아 보지 않고 사용합니다. (그리고, 네,'ToList()'가 필요했습니다.) –

관련 문제