我正在尝试运行与以下内容非常类似的查询:
(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中的类型不能用层次结构构建”,我需要能够获得每本书要显示的类别列表。如果有人能够对可能的解决方案有所了解,那将非常感激。
答案 0 :(得分:1)
问题是您在联合的查询中选择了一个子序列(即b.BookCategories
)。这是LINQ 2 SQL限制。它无法将其转换为SQL(因为它很难做到,所以我猜团队选择不支持这个)。
摆脱子序列选择。在这种情况下,最简单的修复可能是执行union客户端。执行两个服务器端查询并合并结果。
无论如何,性能将是可怕的,因为如果序列子选择。您可能希望研究如何以有效的方式使用L2S获取树。