2016-06-13 5 views
1

У меня есть запрос, похожий на следующий (мой фактический запрос имеет три раздела, подобные этому, а затем Concat s вместе и применяет некоторые дополнительные фильтры и сортировку).Вложенный запрос не поддерживается

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(), нам нужно будет изменить GroupBy, чтобы вернуть все поля, которые мы выбираем, через Key, иначе у нас будут проблемы с ленивой загрузкой и N + 1 запросов.

+0

Это похоже на работу, спасибо. Я не использую 'GroupBy' достаточно, чтобы сделать это, не глядя на некоторые ссылки. (И, да, 'ToList()' был необходим.) –

Смежные вопросы