c# - Union 或 Concat 中的类型不能用层次结构构造

标签 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"
});

在语句执行后,我收到“Union 或 Concat 中的类型无法使用层次结构构造”,我需要能够获取要与每本书一起显示的类别列表。如果有人能够阐明可能的解决方案,我们将不胜感激。

最佳答案

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

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

由于序列子选择,性能无论如何都会很糟糕。您可能想研究如何使用 L2S 有效地获取树。

关于c# - Union 或 Concat 中的类型不能用层次结构构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772489/

相关文章:

c# - 单元测试中的依赖注入(inject)

c# - 非静态类中的静态方法和静态类中的静态方法有什么区别?

javascript - 外部 js 脚本在 View (ASP.NET) 中不起作用

c# - SignalR - 检查用户是否仍然连接

c# - Sharepoint CAML 中的 OR 问题

LINQ - if 条件

c# - UWP C# 滚动到 TextBox 的底部

c# - 我如何处理我的 ViewModel 中的 Validation.Error 而不是我的 View 背后的代码?

javascript - 使用 Web API 的客户端 Web 应用程序,如何根据服务器端 Web API 的期望填充选择框字段值?

c# - 如果我使用 LINQ,如何限制搜索字符