1

ここで非常にイライラしています...通常、ネット上のどこかで.Netの複雑な問題に対するある種の答えを見つけることができますが、これは私にはわかりません。私は、LINQ to Entity クエリの結果を DataSet に変換して、既存のビジネス ロジックでデータを処理できるようにする必要があるシナリオにいます。

EntityCommand がリーダーを生成するような基本的なアプローチを試しましたが、 DataTable.Load() が例外をスローするため、これは機能しません (EntityCommand によって生成されたリーダーは GetSchemaTable() をサポートしていません)。

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 に追加する必要があるテーブルが 1 つまたは 2 つしかない場合は、それらを手動で直接作成しないでください。

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 に答える