Преобразование модели объекта в набор данных - это можно сделать? - PullRequest
1 голос
/ 19 мая 2011

Очень расстроен здесь ... Обычно я могу найти какой-то ответ на сложные вопросы в .Net где-то в сети, но этот ускользает от меня.Я нахожусь в ситуации, когда мне нужно преобразовать результат запроса LINQ to Entity в DataSet, чтобы затем данные могли быть обработаны существующей бизнес-логикой, и я не могу найти ни одного рабочего решения для этого.1001 *

Я пробовал базовые подходы, такие как 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 не предложила бы этот элемент обратной совместимости изи, во-вторых, это не было бы создано сообществом.

Я готов взглянуть на коммера также, если таковые имеются, решения.

Thx!

Ответы [ 3 ]

3 голосов
/ 30 ноября 2012

Вы можете преобразовать результат в список и использовать следующее для преобразования списка в таблицу данных.

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

Надеюсь, это поможет

Preetam

0 голосов
/ 27 июня 2013

Это гибкий код, который должен удовлетворить большинство ваших потребностей:

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;
    }
0 голосов
/ 19 мая 2011

Возможно, это не лучшее решение, но если в вашем сценарии есть только одна или две таблицы, которые необходимо добавить в набор данных, почему бы не создать их напрямую вручную.

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.

...