Преобразование Linq Query в DataSet завершается неудачно - PullRequest
0 голосов
/ 05 мая 2011

Я перевожу старое приложение .net в .net 4, эту миграцию нужно выполнить в несколько этапов, поэтому некоторые методы могут показаться немного нестандартными. Во всяком случае ...

У меня есть хранимая процедура (Analysis_select), возвращающая одну строку с несколькими столбцами с результатом. Если я позвоню с

var result = dbContext.Analysis_select(user.UserId, Year, Week);

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

Если я пытаюсь преобразовать его в DataSet, это не удается, Visual Studio фактически говорит, что это нормально, но при рендеринге на веб-странице происходит сбой

var result = (DataSet)dbContext.Analysis_select(user.UserId, Year, Week);

Ошибка выглядит следующим образом

Невозможно привести объект типа 'SingleResult`1 [Analysis_select]' к типу "System.Data.DataSet".

Я читал о некоторых других преобразованиях из linq в DataSet, но большинство методов кажутся немного излишними для этого. Причина, по которой я хочу сохранить DataSet, состоит в том, что в зависимости от таких результатов существует десятки тысяч строк кода. Отстой, да, но можешь ли ты помочь мне это исправить?

Любая помощь высоко ценится, спасибо!

Ответы [ 4 ]

2 голосов
/ 05 мая 2011

Я не предлагаю это как отличное решение или лучшие практики;Существует совершенно определенно другой (и, вероятно, лучше) путь.Для случая, когда у вас есть IEnumerable и нет других средств для создания таблицы данных, может появиться отражение. Вы можете использовать что-то вроде ниже ...

public static class ExtensionMethods
{
    public static DataTable ToDataTable<T>(this IEnumerable<T> items)
    {
        DataTable table = new DataTable();
        var properties = typeof(T).GetProperties();

        foreach (var propertyInfo in properties)
        {                
            table.Columns.Add(propertyInfo.Name, typeof(object));
        }

        foreach (var item in items)
        {
            var row = properties.Select(p => NormalizeObject(p.GetValue(item, null))).ToArray();                                
            table.Rows.Add(row);
        }

        return table;
    }

    private static object NormalizeObject(object value)
    {
        Binary bin = value as Binary;
        if (bin != null)
        {
            return bin.ToArray();
        }

        XElement element = value as XElement;
        if (element != null)
        {
            return element.ToString();
        }

        return value;
    }
}
1 голос
/ 05 мая 2011

Вам понадобится написать метод расширения для преобразования IEnumerable в DataSet.Вот пример того, как преобразовать IEnumerable в DataTable.

private DataTable ToDataTable<T>(List<T> items)
{
    var table = new DataTable(typeof (T).Name);

    PropertyInfo[] props = typeof (T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

    foreach (PropertyInfo prop in props)
    {
        Type t = GetCoreType(prop.PropertyType);
        table.Columns.Add(prop.Name, t);
    }

    foreach (T item in items)
    {
        var values = new object[props.Length];

        for (int i = 0; i < props.Length; i++)
        {
            values[i] = props[i].GetValue(item, null);
        }

        table.Rows.Add(values);
    }

    return table;
}
public static Type GetCoreType(Type t)
{
    if (t != null && IsNullable(t))
    {
        if (!t.IsValueType)
        {
            return t;
        }
        else
        {
            return Nullable.GetUnderlyingType(t);
        }
    }
    else
    {
        return t;
    }
}
public static bool IsNullable(Type t)
{
    return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
}

Вот ссылка на источник этого решения: http://www.chinhdo.com/20090402/convert-list-to-datatable/

1 голос
/ 05 мая 2011

С помощью хранимых процедур LINQ2SQL вы никогда не получите наборы данных.То, что вы получаете, это именно то, что SingleResult.IEnumerable.

1 голос
/ 05 мая 2011

Вы проверяли этот урок http://msdn.microsoft.com/en-us/library/bb386921.aspx от MS? В противном случае нет прямого преобразования между результатом LINQ и набором данных.

...