Union或Concat中的类型不能使用层次结构构造

时间:2012-10-07 20:14:09

标签: c# asp.net linq

我正在尝试运行与以下内容非常类似的查询:

(from bs in DataContext.TblBookShelf
join b in DataContext.Book on bs.BookID equals b.BookID
where bs.BookShelfID == bookShelfID 
select new BookItem
{
        Categories = String.Join("<br/>", b.BookCategories.Select(x => x.Name).DefaultIfEmpty().ToArray()),
    Name = b.Name,
ISBN = b.ISBN,
BookType = "Shelf"
}).Union(from bs in DataContext.TblBookShelf
join bi in DataContext.TblBookInventory on bs.BookID equals bi.BookID
    select new BookItem
    {
          Categories = String.Join("<br/>", bi.BookCategories.Select(x => x.Name).DefaultIfEmpty().ToArray()),
          Name = bi.Name,
      ISBN = bi.ISBN,
      BookType = "Inventory"
});

我在语句执行后收到“联盟或Concat中的类型不能用层次结构构建”,我需要能够获得每本书要显示的类别列表。如果有人能够对可能的解决方案有所了解,那将非常感激。

1 个答案:

答案 0 :(得分:1)

问题是您在联合的查询中选择了一个子序列(即b.BookCategories)。这是LINQ 2 SQL限制。它无法将其转换为SQL(因为它很难做到,所以我猜团队选择不支持这个)。

摆脱子序列选择。在这种情况下,最简单的修复可能是执行union客户端。执行两个服务器端查询并合并结果。

无论如何,性能将是可怕的,因为如果序列子选择。您可能希望研究如何以有效的方式使用L2S获取树。