【问题标题】:Returning a custom enumerable type from ObjectDataSource business class从 ObjectDataSource 业务类返回自定义可枚举类型
【发布时间】:2014-07-05 22:39:21
【问题描述】:

这个问题可能看起来很基础,但我对 C# 的这些方面真的很陌生。我很抱歉。

我正在开发一个 ASP.NET 4 Web 窗体应用程序。

这是我的书桌

BookID (pk) 书名 作者ID 主题ID 份数

这是我的作者表

作者

作者ID(pk) 作者姓名

主题表

主题

主题ID(pk) 主题名称

我已经从数据库中的这些表生成了 ADO.NET 模型类。

我为我的 Book 模型(包含 CRUD 方法)创建了一个业务类,以便我可以使用 ObjectDataSource 对 Book 执行 CRUD 操作

这是我的商务舱的get方法

public static IEnumerable<Book> GetAllBooks()
    {
        var result = from author in db.Authors
                 join book in db.Books on new { AuthorID = author.AuthorID } equals new { AuthorID = book.AuthorID }
                 join subject in db.Subjects on new { SubjectID = book.SubjectID } equals new { SubjectID = subject.SubjectID }
                 select new { BookID = book.BookID, BookName = book.BookName, Copies = book.Copies, AuthorName = author.AuthorName };


        return result.ToList();
    }

这个方法的返回类型是 IEnumerable 但是由于我现在返回的是一个匿名对象的列表,所以这个返回类型是无效的。

我知道我可以通过扩展 Book 模型类使其包含 AuthorName 和 SubjectName 来解决这个问题,然后使用该模型类,但我想避免编写更多代码。

还有其他方法可以返回这个匿名对象列表吗?

【问题讨论】:

    标签: asp.net ienumerable objectdatasource


    【解决方案1】:

    如果你真的想要匿名对象,你可以只返回IEnumerable&lt;dynamic&gt; 而不是IEnumerable&lt;Book&gt;,但你在这里走错了方向。在您的代码中进一步使用 GetAllBooks 方法时,您将不知道这些对象具有哪些属性,您将不得不返回您的业务代码以确保 - 更糟糕的是:编译器不会帮助您完全捕捉错别字。尝试坚持使用强类型对象。

    【讨论】:

      【解决方案2】:

      你可以:

      1. 创建仅包含此属性的类:

        公共类 BookModel { int BookID{get;set;} 字符串书名{get;set;} ?复制{get;set;} 字符串作者姓名{get;set;} }

      并使用它来代替匿名。 2. 在 Book 实体类中为 Author 和 Subject 创建导航属性,并使用 Include() 而不是 Join() 从 db 中获取其数据。比如:

      var result  = db.Books.Include(b=>b.Author).Include(b=>b.Subject);
      
      return result;
      

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 2018-02-23
        • 2016-07-17
        相关资源
        最近更新 更多