2

我有以下服务方法 -

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

4 回答 4

8

数据表IList

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

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

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

您可以使用IList. 改进不是更快的数据访问,而是不使用DataTable提供的额外功能。如果您不需要通过索引访问,您可以通过使用进一步改进IEnumerable
您可以通过使用泛型版本进一步改进。IList<T>,或IEnumerable<T>节省装箱/拆箱开销。

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

DataTable除了按索引访问之外,IList 没有过多的功能开销。

使用 DataTable 有什么问题?

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

于 2013-01-09T05:13:56.203 回答
0

如果您想对数据库或数据库表进行建模,那么我建议您选择作为的数据表。IList是一个接口,没有数据表的特性。

于 2013-01-09T05:39:57.843 回答
0

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

您可以使用扩展方法而不是直接调用静态方法。我觉得它看起来更干净。

变量query不能为空。

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

IList<T>与(or IEnumerable<T>)不同,使用 IList 代替 DataTable 并没有太大的优势。T是另一个具有域对象含义的类Book

UsingIList<T>提供了对类型 T 的硬控制,并分别减少了错误,但设计起来更加困难。

使用 DataTable 有什么问题?

你应该明白,你的方法的调用者对你RowsDataTable.

于 2013-01-09T07:37:05.223 回答
0

通常,我们在使用服务时尝试保持通用性,如果您从这方面来看,请使用 IList。但是,正如@Tilak 提到的,datatable 提供了更多功能。

于 2016-10-03T07:52:00.153 回答