什么是将IQueryable对象转换为数据集的最简单方法?
modelshredder有你需要的功能。如果您已经拥有数据上下文并且不需要以模型的形式使用数据,那么nitzmahone的解决方案在性能方面是可以接受的(如果它与您的设置匹配,这对我来说不是很清楚)。
(yourDatacontext).GetCommand(yourIQueryableHere)将命令文本传递给DbCommand对象,调用ExecuteReader方法,将reader传递给数据集的.Load方法。
public static DataTable AsDataTable(this IQueryable value, DataTable table)
{
var reader = value.GetEnumerator();
while (reader.MoveNext())
{
var record = (Customer)reader.Current;
table.Rows.Add(record.CustomerID, record.City);
}
return table;
}
[Table(Name = "Customers")]
public class Customer
{
[Column(IsPrimaryKey = true)]
public string CustomerID;
[Column]
public string City;
}
还有其他选项可以使用反射从Customer类构建DataTable。考虑到反射的性能影响,我选择使用以下方法来构建我的表:
public DataTable GetSchema(params string[] columns)
{
string col_list;
if (columns.Length == 0)
col_list = "*";
else
col_list = String.Join(", ", columns);
return Provider.QueryAsDataTable(string.Format("select top 0 {0} from customers", col_list));
}
dgridRO.DataSource = new DataView(rows.AsDataTable(dmap.GetSchema("CustomerID", "City")));
**
** 我花了很多精力将IQueryable转换为DataTable,只是为了创建一个DataView作为DataGridView的数据源。现在我知道我其实不需要这样做。
最简单的方法可能是编写一个IDataReader实现,可以封装IEnumerable(IQueryable是IEnumerable)。这里有一个实现在此处。然后您可以调用DataTable.Load(IDataReader)。