Linq to sql将IQueryable转换为Dataset

将IQueryable对象转换为数据集的最简单方法是什么?

modelshredder正是您所需要的。 如果你有datacontext并且不需要你的模型的数据,nitzmahone的解决方案是明智的(如果它符合你的设置,我不清楚)

(yourDatacontext).GetCommand(yourIQueryableHere),将命令文本传递给DbCommand对象,调用ExecuteReader,将reader传递给数据集的.Load方法。

最简单的方法可能是编写一个可以包装IEnumerable的IDataReader实现(IQueryable是一个IEnumberable)。 这里有一个实现。 然后你可以调用DataTable.Load(IDataReader)。

如果你从模式创建一个DataTable,它匹配你的LINQ到Sql,我有一个扩展方法,它接受IQueryable并填充DataTable:

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; } 

请注意,对客户的强制转换是我的TEntity:

 [Table(Name = "Customers")] public class Customer { [Column(IsPrimaryKey = true)] public string CustomerID; [Column] public string City; } 

还有其他选项使用reflection来从Customer类构建DataTable。 鉴于reflection的性能,我选择使用以下方法来构建我的表:

 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)); } 

把所有这些放在一起,我能够将结果推送到我的DataGridView:

  dgridRO.DataSource = new DataView(rows.AsDataTable(dmap.GetSchema("CustomerID", "City"))); 

**

ID10TException:

**我花了所有这些努力从IQueryable转换到DataTable,因此我可以创建一个DataView作为DataGridView的源。 嗯,我知道我现在不需要那样做。