这个问题可能看起来很基本但我对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,然后使用该模型类,但我想避免编写更多代码。
还有其他方法可以返回此匿名对象列表吗?
答案 0 :(得分:1)
如果您真的想要匿名对象,那么您可以返回IEnumerable<dynamic>
而不是IEnumerable<Book>
,但这里的方向不好。在代码中进一步使用GetAllBooks
方法时,您将不知道这些对象具有哪些属性,您将不得不返回到业务代码以确保 - 甚至更糟:编译器不会帮助你抓住错别字。尝试坚持使用强类型对象。
答案 1 :(得分:0)
你可以:
创建仅包含属性的类:
公共类BookModel { int BookID {get; set;} string BookName {get; set;} ?副本{获得;设置;} string AuthorName {get; set;} }
并使用它代替anonimous。 2.在Book实体类中为Author和Subject创建导航属性,并使用Include()而不是Join()从db获取其数据。类似的东西:
var result = db.Books.Include(b=>b.Author).Include(b=>b.Subject);
return result;