1

在这里非常沮丧......我通常可以在网上某处的.Net中找到某种复杂问题的答案,但这个答案让我望而却步。我在一个场景中,我必须将 LINQ to Entity 查询的结果转换为 DataSet,以便数据可以由现有的业务逻辑处理,但我找不到一个可行的解决方案。

我已经尝试过像 EntityCommand 生成阅读器这样的基本方法,但是这个方法不起作用,因为 DataTable.Load() thorws an excpetion(EntityCommand 生成的阅读器不支持 GetSchemaTable() )。

我还尝试了更多 [supposed] 友好的方法,例如 Entity to IDataReader(http://l2edatareaderadapter.codeplex.com/),但是这个会引发异常,文档很少,并且自 2008 年以来一直没有被触及。

我发现的另一种方法是在这里(http://blogs.msdn.com/b/alexj/archive/2007/11/27/hydrating-an-entitydatareader-into-a-datatable-part-1.aspx),但确实没有代码的工作副本;只有片段。

我很难相信首先 MS 不会提供这种开箱即用的向后兼容项目,其次,它也不会由社区创建。

如果有任何可用的商业解决方案,我也愿意研究。

谢谢!

4

3 回答 3

3

您可以将结果转换为列表并使用以下内容将列表转换为数据表。

public DataTable ConvertToDataTable<T>(IList<T> data)
    {
        PropertyDescriptorCollection properties =
           TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            DataRow row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;

    }

http://social.msdn.microsoft.com/Forums/br/csharpgeneral/thread/6ffcb247-77fb-40b4-bcba-08ba377ab9db

希望这可以帮助

普列塔姆

于 2012-11-29T22:43:34.637 回答
0

这是一个灵活的代码,应该可以满足您的大部分需求:

public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
    {
        DataTable dtReturn = new DataTable();
        // column names
        PropertyInfo[] oProps = null;
        if (varlist == null) return dtReturn;
        foreach (T rec in varlist)
        {
            // Use reflection to get property names, to create table, Only first time, others will follow
            if (oProps == null)
            {
                oProps = ((Type)rec.GetType()).GetProperties();
                foreach (PropertyInfo pi in oProps)
                {
                    Type colType = pi.PropertyType;
                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    {
                        colType = colType.GetGenericArguments()[0];
                    }

                    dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                }
            }

            DataRow dr = dtReturn.NewRow();
            foreach (PropertyInfo pi in oProps)
            {
                dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
                (rec, null);
            }

            dtReturn.Rows.Add(dr);
        }

        return dtReturn;
    }
于 2013-06-27T06:29:27.407 回答
0

这可能不是最好的解决方案,但如果您的方案只有一两个表需要添加到 DataSet,为什么不直接手动构建它们。

var result = db.YourTable; // get your Linq To Entities result.

DataSet ds = new DataSet();
DataTable tbl = new DataTable();
tbl.Columns.Add("col1", typeof(string));
tbl.Columns.Add("col2", typeof(int));

foreach (var r in result)
{
  var row = tbl.NewRow();
  row[0] = r.Col1;
  row[1] = r.Col2;

  tbl.Rows.Add(r);

}

ds.Tables.Add(tbl);

Col1 和 Col2 来自您的 Linq To Entity 对象,您可以像这样创建您需要的所有表并返回您的 DataSet。

于 2011-05-19T19:45:03.483 回答