将IQueryable转换为Dataset的Linq to sql方法

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

你会用这个数据集做什么? - Joel Coehoorn
传统代码需要一个数据集对象。 - jinsungy
4个回答

3

modelshredder有你需要的功能。如果您已经拥有数据上下文并且不需要以模型的形式使用数据,那么nitzmahone的解决方案在性能方面是可以接受的(如果它与您的设置匹配,这对我来说不是很清楚)。


1
ModelShredder现在是moreLinq的一部分了。https://code.google.com/archive/p/morelinq/ - Michael Freidgeim

2

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


我不确定OP是否有一个DataContext或者在谈论一个数据库查询。如果是的话,你是对的,这是最简单的。我们只是不知道IQueryable是什么。 - Mike Two

0
如果您从架构创建一个DataTable以匹配您的LINQ to 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;
}

请注意,将类型转换为Customer是我的TEntity:
[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));
}

将所有这些内容结合起来,我能够将结果推送到我的DataGridView中:
    dgridRO.DataSource = new DataView(rows.AsDataTable(dmap.GetSchema("CustomerID", "City")));


**

ID10T异常:

** 我花了很多精力将IQueryable转换为DataTable,只是为了创建一个DataView作为DataGridView的数据源。现在我知道我其实不需要这样做。


0

最简单的方法可能是编写一个IDataReader实现,可以封装IEnumerable(IQueryable是IEnumerable)。这里有一个实现在此处。然后您可以调用DataTable.Load(IDataReader)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接