2013-01-09 184 views
1

我有以下服务方法 -DataTable或IList?哪个更好?

public static DataTable GetBookDetails(BookEntities context) 
    { 
     DataTable dtBooks= new DataTable(); 
     dtBooks.TableName = "BookDetails"; 
     dtBooks.Columns.Add(new DataColumn("Name",typeof(string))); 
     dtBooks.Columns.Add(new DataColumn("ISBN",typeof(string))); 
     dtBooks.Columns.Add(new DataColumn("Price",typeof(int))); 
     dtBooks.Columns.Add(new DataColumn("Author",typeof(string))); 
     IQueryable<Book> query = from b in context.Books.Include("Authors") 
                     .Include("Details/Price") 
                     .Include("Activity") 
            where b.Activity.IsActive 
            select b; 
     if (query != null) 
     { 
      var sorted = query.ToArray().OrderByDescending(b => b.Activity.DateCreated); 
      foreach (Book bb in sorted) 
      { 
       DataRow row = dtBooks.NewRow(); 
       row["Name"] = bb.Name; 
       row["ISBN"] = bb.ISBN; 
       row["Price"] = bb.Details.Price.CostOfBook; 
       row["Author"] = bb.Authors.Name; 
       dtBooks.Rows.Add(row); 
      } 
     } 
     else 
      dtBooks= null; 
     return dtBooks; 
    } 

我的问题是 -

  1. 这是一个有效的方式来获得细节还是可以改善这种方法?
  2. 有人建议我使用IList而不是DataTable。我应该使用这个吗?如果是这样,有什么优势?
  3. 使用DataTable有什么问题?
+1

难道你没有一个可以使用的相关的Book类吗? – V4Vendetta

+1

检查这个http://stackoverflow.com/questions/896238/datatables-vs-ienumerablet –

+0

@RTRokzzz你如何使用Inculde()。如果它是扩展方法,你可以分享它的代码。 –

回答

7

DataTable VS IList

IList表示集合,可以通过索引来访问。而已。

DataTable也具有类似能力,但它提供了更多的功能(如多eventsMore features)并且适合在需要像具有改变预先能力(结合,自定义分类,分组,事件行表示表格数据,这些特征,细胞添加等)。所有这些额外功能都会带来额外的开销(更多的内存需求)。

这是获得细节的有效方式还是我可以改进此方法?

您可以通过使用IList稍微改善。改进不在于更快的数据访问,而是不使用DataTable提供的额外功能。如果您不需要索引访问,则可以使用IEnumerable进一步改进。
您可以通过使用泛型版本进一步改进。 IList<T>IEnumerable<T>保存在装箱/取消装箱开销。

有人建议我使用IList而不是DataTable。我应该使用这个吗?如果是这样,有什么优势?

IList不具有DataTable提供的过多索引访问以外的功能开销。

使用DataTable有什么问题?

没有错。 DataTable更适合需要高级数据访问功能的地方。

0

如果你想建模一个数据库或数据库表,那么我建议你去datatable这是一个类。 IList是一个接口,不具有datable的功能。

0

这是获取详细信息的有效方式还是我可以改进此方法?

您可以使用扩展方法代替直接调用静态方法。我认为它看起来更干净。

变量query不能为空。

有人建议我使用IList而不是DataTable。我应该使用这个吗?如果是这样,有什么优势?

有使用的,而不是数据表的IList的没有什么大的优势,不像IList<T>(或IEnumerable<T>)。 T是具有域对象Book的含义的另一类。

使用IList<T>提供了对T型和较少错误的硬控制,但设计起来更加困难。

使用DataTable出了什么问题?

你应该明白你的方法的电话,对方不知道的Rows混凝土结构在DataTable什么。

0

通常我们会在使用服务时尝试保持通用性,如果您从这些方面寻找,请使用IList。但是,@Tilak提到的数据表提供了更多的功能。