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