【问题标题】:Linq to SQL over zealous serializationLinq to SQL 过热的序列化
【发布时间】:2011-02-18 04:11:03
【问题描述】:

我正在使用 .NET MVC 开发 API 并以 JSON 格式返回结果。起初,我从数据库以 IEnumerable 形式返回的结果似乎可以正常工作,然后将其转换为要返回的 JSONResult 类型。

这为我序列化层次结构,并且子对象会根据设计器中的关系自动加载,并成为 JSON 层次结构的一部分。

IEnumerable<Book> books= _contentRepository.GetBooks();

return Json(new {
                   success = true,
                   data = new {
                                 books = books
                              }
                }, JsonRequestBehavior.AllowGet);

这种能力也是问题所在,因为有时会加载我不需要的整个子对象。例如,假设我有一个书实体,它有相关的书,而这些相关的书也有相关的书,树很快就会变得很深。

Rick Strahl 在他的文章结尾谈到了这一点:http://www.west-wind.com/weblog/posts/147218.aspx

我还是想保持分层,这样json也是分层的。例如book.author, book.publisher[0].name 但我想控制查询中加载的内容。

我是否正在考虑删除设计器中实体之间的所有链接并在查询中指定连接,并可能手动构建生成的层次结构?

【问题讨论】:

    标签: asp.net-mvc linq json linq-to-sql serialization


    【解决方案1】:

    我会使用视图模型:一个专门为满足视图要求(或在您的情况下为 JSON 结构)而定制的类。然后在从数据库中获取的模型和视图模型之间进行控制器操作map。现在您可以完全控制了。

    IEnumerable<Book> books = _contentRepository.GetBooks();
    IEnumerable<BookViewModel> bookViewModels = Mapper.Map<IEnumerable<Book>, IEnumerable<BookViewModel>>(books);
    return Json(
        new { success = true, data = bookViewModels }, 
        JsonRequestBehavior.AllowGet
    );
    

    【讨论】:

    • 这非常适合确保只返回所需的数据(您是否使用 Automapper),但首先加载不需要的数据,并且可能会减慢速度)作为主对象的子集合。 ..
    【解决方案2】:

    您如何自动加载相关对象?通常,这些集合是延迟的 EntitySet 实例,如果它们没有被枚举,则不会加载它们。你确定你有你要解决的问题吗?

    【讨论】:

    • 我的存储库方法返回的 IEnumerable 也包含所有子对象,除非我在 dbml 中将关系标记为内部...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多