不支持嵌套查询

时间:2016-06-13 23:22:37

标签: c# sql linq

我有一个类似于以下的查询(我的实际查询有三个这样的部分,然后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'

如果我删除该行,一切都按预期工作。有没有办法执行这样的查询?

1 个答案:

答案 0 :(得分: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个查询。