【问题标题】:Use LINQ for double-nested OData collection使用 LINQ 进行双嵌套 OData 收集
【发布时间】:2010-12-14 16:40:56
【问题描述】:

我有一个用于书籍的自定义 OData 提要。每本书可以有多个作者,一个作者可以参与多本书,所以我使用连接表(Book - BookAuthorJoin - Author)实现了这一点。我的代理对象有 Book.BookAuthorJoins BookAuthorJoin.Books & BookAuthorJoin.Authors。

我想要做的是有一个单一的查询,我在一个 LINQ 查询中获取作者的所有书籍,但在应用过滤器时遇到了问题。似乎我想要两个 Expand() 方法,但这不起作用。以下查询不起作用,但显示了我正在尝试做的事情:

var query = from book in ODataContext.Books.Expand("BookAuthorJoins").Expand("Authors")
            where book.BookAuthorJoins.Author.AuthorID = authorID
            select book;

【问题讨论】:

    标签: linq odata


    【解决方案1】:

    在服务器端,一对多或多对多的关系通常只是作为一个导航属性暴露出来,暴露在中间的连接表会让你的生活变得更加困难。如果您使用 EF,您应该能够隐藏表格并将关系公开为导航属性。 无论如何,要获取某个作者的所有书籍,查询应该如下所示:

    /Authors(123)/Books
    

    此查询的结果只是书籍的提要。

    如果你确实暴露了连接表,那么类似这样的工作:

    /Authors(123)/BookAuthorJoins?$expand=Book
    

    但是这次你也得到了所有 BookAuthorJoins 和 Book。

    【讨论】:

    • Vitek- 谢谢...我隐藏这一点的挑战是我的连接表还包含另一个字段:排序顺序(因为书中有主要和次要作者)。所以我需要保留/显示这一点。
    • 那么第二个带有扩展的样本是唯一的方法。如果要减小大小,可以使用 $select 限制客户端检索到的属性数量,但结果将包含连接表结果和书籍。
    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多