从ObjectDataSource业务类返回自定义可枚举类型

时间:2014-07-05 22:39:21

标签: asp.net ienumerable objectdatasource

这个问题可能看起来很基本但我对C#的这些方面真的很新。道歉。

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

这是我的书表

BookID(pk) BOOKNAME 的AuthorID SubjectID 拷贝

这是我的作者表

作者

的AuthorID(PK) AUTHORNAME

主题表

主题

SubjectID(PK) 主旨名称

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

我为图书模型(包含CRUD方法)创建了一个商务套,这样我就可以使用ObjectDataSource在图书上执行CRUD操作

以下是我的商务舱的获取方法

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,然后使用该模型类,但我想避免编写更多代码。

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

2 个答案:

答案 0 :(得分:1)

如果您真的想要匿名对象,那么您可以返回IEnumerable<dynamic>而不是IEnumerable<Book>,但这里的方向不好。在代码中进一步使用GetAllBooks方法时,您将不知道这些对象具有哪些属性,您将不得不返回到业务代码以确保 - 甚至更糟:编译器不会帮助你抓住错别字。尝试坚持使用强类型对象。

答案 1 :(得分:0)

你可以:

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

    公共类BookModel {     int BookID {get; set;}     string BookName {get; set;}     ?副本{获得;设置;}     string AuthorName {get; set;} }

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

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