DataTable还是IList?哪个更好?

时间:2013-01-09 05:02:57

标签: c# asp.net linq list linq-to-entities

我有以下服务方法 -

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有什么问题?

4 个答案:

答案 0 :(得分:7)

DataTable vs IList

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

DataTable也具有相似的功能,但它提供了更多功能(例如更多eventsMore features),适用于需要这些功能的地方,例如使用高级功能表示表格数据(绑定,自定义排序,分组,行更改事件,添加单元格等)。所有这些额外功能都需要额外的开销(更多内存要求)。

  

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

使用IList可以略微改善。改进不在于更快的数据访问,而在于不使用DataTable提供的额外功能。如果您不需要按索引访问,则可以使用IEnumerable进一步改进。 您可以使用泛型版本进一步改进。 <{1}}或IList<T>以节省装箱/拆箱费用。

  

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

IList没有IEnumerable<T>提供的大量功能的开销,而不是索引访问。

  

使用DataTable有什么不对?

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

答案 1 :(得分:0)

如果你想建模数据库或数据库表,那么我建议你选择 datatable 这是一个类。 IList 是一个界面,没有数据的功能。

答案 2 :(得分:0)

  

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

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

变量query不能为空。

  

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

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

使用IList<T>提供对类型T的硬控制,并分别减少错误,但设计起来比较困难。

  

使用DataTable有什么问题?

您应该了解您的方法的调用者对RowsDataTable的具体结构一无所知。

答案 3 :(得分:0)

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