我有以下服务方法 -
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;
}
我的问题是 -
答案 0 :(得分:7)
IList
表示可以通过索引访问的集合。而已。
DataTable
也具有相似的功能,但它提供了更多功能(例如更多events,More 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有什么问题?
您应该了解您的方法的调用者对Rows
中DataTable
的具体结构一无所知。
答案 3 :(得分:0)
通常情况下,我们会尝试在使用服务时保持通用性,如果您从这些方面看,请使用IList。但是,数据表提供了更多功能,正如@Tilak所提到的那样。