我正在尝试运行与以下内容非常相似的查询:
(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"
});
在语句执行后,我收到“Union 或 Concat 中的类型无法使用层次结构构造”,我需要能够获取要与每本书一起显示的类别列表。如果有人能够阐明可能的解决方案,我们将不胜感激。
最佳答案
问题在于您在联合的查询中选择了一个子序列(即 b.BookCategories
)。这是 LINQ 2 SQL 的限制。它无法将其转换为 SQL(因为这很难做到,所以我猜团队选择不支持这一点)。
去掉子序列选择。在这种情况下,最简单的修复可能是执行联合客户端。执行两个服务器端查询并合并结果。
由于序列子选择,性能无论如何都会很糟糕。您可能想研究如何使用 L2S 有效地获取树。
关于c# - Union 或 Concat 中的类型不能用层次结构构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772489/