Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq и SqlDataReader / 25 сообщений из 29, страница 1 из 2
07.10.2011, 12:34
    #37472652
artemius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Здравствуйте всем,

имеется SqlDataReader. Как можно с помощью Linq преобразовать его в массив классов, поля которого являются полями таблицы?

Спасибо!
...
Рейтинг: 0 / 0
08.10.2011, 00:59
    #37473760
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
artemiusЗдравствуйте всем,

имеется SqlDataReader. Как можно с помощью Linq преобразовать его в массив классов, поля которого являются полями таблицы?

Спасибо!
Никак. Это разные идеологии чтения данных.
Общее у них то, что и из SqlDataReader, и используя Linq можно заполнить List<класс>
...
Рейтинг: 0 / 0
08.10.2011, 09:37
    #37473826
Верблюд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
artemiusмассив классов, поля которого

у классов нет полей
...
Рейтинг: 0 / 0
09.10.2011, 16:25
    #37474634
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Верблюду классов нет полей
А что есть у классов?
...
Рейтинг: 0 / 0
09.10.2011, 18:20
    #37474667
Верблюд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
МСУВерблюду классов нет полей
А что есть у классов?

свойства, методы. Если же ты хочешь выставить поля наружу - твое конечно дело, но как ты потом будешь их изменения отслеживать?
...
Рейтинг: 0 / 0
09.10.2011, 18:23
    #37474672
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
artemiusимеется SqlDataReader. Как можно с помощью Linq преобразовать его в массив классов, поля которого являются полями таблицы? Можно. Но причём тут LINQ?
...
Рейтинг: 0 / 0
09.10.2011, 18:25
    #37474673
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Верблюдсвойства, методы. Если же ты хочешь выставить поля наружу - твое конечно дело, но как ты потом будешь их изменения отслеживать? А если я не хочу отслеживать их изменения? :-) Впрочем, если я потом это захочу - поменяю поля на свойства, всё перекомпилирую и всё. :-)
...
Рейтинг: 0 / 0
09.10.2011, 18:27
    #37474677
Верблюд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Алексей Квсё перекомпилирую и всё. :-)

Ога, ога. И все остальные пять тысяч проетов, которые ведет твоя компания тоже перекомпилирую... заодно будет чем программистам заняться - они же всеравно ничего не делают...
...
Рейтинг: 0 / 0
09.10.2011, 18:29
    #37474680
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
ВерблюдАлексей Квсё перекомпилирую и всё. :-)

Ога, ога. И все остальные пять тысяч проетов, которые ведет твоя компания тоже перекомпилирую... заодно будет чем программистам заняться - они же всеравно ничего не делают...А я опишу класс как private или internal. :-)
...
Рейтинг: 0 / 0
09.10.2011, 18:36
    #37474685
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Опять же, если это DTO, передаваемый через WCF. В нём логики нет по определению. WCF без проблем распознаёт публичные поля. LINQ тоже. Накой тут свойства?

ЗЫ: Писать просто { get; set; } лень.
...
Рейтинг: 0 / 0
09.10.2011, 18:44
    #37474690
Верблюд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Алексей КОпять же, если это DTO, передаваемый через WCF. В нём логики нет по определению. WCF без проблем распознаёт публичные поля. LINQ тоже. Накой тут свойства?

ЗЫ: Писать просто { get; set; } лень.

Ну ладно, пусть будет DTO. Но тут человек хочет, как я понял, датаридер на бизнес-объекты отразить... где Сева с его CSLA?
...
Рейтинг: 0 / 0
09.10.2011, 18:48
    #37474692
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Верблюдгде Сева с его CSLA? Ну может пока BLToolkit-ный маппер предложим?
...
Рейтинг: 0 / 0
09.10.2011, 19:46
    #37474739
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
ВерблюдА что есть у классов?
свойства, методы. Если же ты хочешь выставить поля наружу - твое конечно дело, но как ты потом будешь их изменения отслеживать? [/quot]
Стоп стоп стоп. Верблюд, давеча Вы утверждали, что у классов нет полей. А теперь говорите обратное. Давайте определимся, у классов есть поля или нету?
...
Рейтинг: 0 / 0
09.10.2011, 19:49
    #37474741
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
По теме: 10281093
...
Рейтинг: 0 / 0
09.10.2011, 19:58
    #37474745
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
МСУПо теме: 10281093 Reflection - не наш метод. Взрослые дядьки делают через Emit. Мутим EmitPropertyInfo с методами GetValue и SetValue и применяем везде. В том числе и для этой задачи. Могу завтра выложить если интересно.
...
Рейтинг: 0 / 0
09.10.2011, 20:41
    #37474772
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Алексей КМСУПо теме: 10281093 Reflection - не наш метод. Взрослые дядьки делают через Emit. Мутим EmitPropertyInfo с методами GetValue и SetValue и применяем везде. В том числе и для этой задачи. Могу завтра выложить если интересно.
Ок, интересно было бы глянуть. Заодно посостязаемся, чей маппер будет шустрее :)
...
Рейтинг: 0 / 0
09.10.2011, 20:48
    #37474776
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Алексей КМСУПо теме: 10281093 Reflection - не наш метод. Взрослые дядьки делают через Emit. Мутим EmitPropertyInfo с методами GetValue и SetValue и применяем везде. В том числе и для этой задачи. Могу завтра выложить если интересно.
Ок, интересно было бы глянуть. Заодно посостязаемся, чей маппер будет шустрее :)
...
Рейтинг: 0 / 0
10.10.2011, 06:00
    #37474964
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
МСУНу там маппера как такового нет. Там заготовка для него. А дальше используем эту заготовку как обычный рефлекшен везьде где нужно динамически обращаться к свойствам.

Не для слабонервных
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
    public static class DictionaryHelper
    {
        public static TValue GetValueOrDefault<TKey, TValue>(
            this Dictionary<TKey, TValue> src, 
            TKey key,
            TValue defaultValue = default(TValue))
        {
            TValue result;
            if (src.TryGetValue(key, out result))
                return result;
            return defaultValue;
        }

        public static TValue GetOrAddValue<TKey, TValue>(
            this Dictionary<TKey, TValue> src,
            TKey key,
            Func<TValue> getNewValue)
        {
            TValue result;
            if (src.TryGetValue(key, out result) == false)
            {
                result = getNewValue();
                src.Add(key, result);
            }
            return result;
        }
    }

    static class EmitTypeInfo
    {
        class EmitPropertyInfoCollection
        {
            public EmitPropertyInfo[] Items;
            public Dictionary<string, EmitPropertyInfo> ByName;
        }

        class CacheDictionary : Dictionary<Type, EmitPropertyInfoCollection>
        { }

        static CacheDictionary Cache = new CacheDictionary();

        public static IEnumerable<EmitPropertyInfo> GetProperties(Type type)
        {
            return GetPropertiesInternalCollection(type).Items;
        }

        public static EmitPropertyInfo FindProperty(Type type, string propertyName)
        {
            var result = GetProperty(type, propertyName);

            if (result == null)
                throw new ArgumentException(
                    string.Format("Property {0}.{1} not found", type.FullName, propertyName)
                );

            return result;
        }

        public static EmitPropertyInfo GetProperty(Type type, string propertyName)
        {
            return GetPropertiesInternalCollection(type)
                .ByName
                .GetValueOrDefault(propertyName);
        }

        static EmitPropertyInfoCollection GetPropertiesInternalCollection(Type type)
        {
            lock (Cache)
                return Cache.GetOrAddValue(
                    type,
                    () =>
                    {
                        var items = CreateEmitProperties(type).ToArray();
                        return new EmitPropertyInfoCollection
                        {
                            Items = items,
                            ByName = items.ToDictionary(v => v.Property.Name)
                        };
                    }
                );
        }

        static IEnumerable<EmitPropertyInfo> CreateEmitProperties(Type type)
        {
            var properties = type
                .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .Where(v =>
                    (v.GetGetMethod() == null || v.GetGetMethod().GetParameters().Length == 0) &&
                    (v.GetSetMethod() == null || v.GetSetMethod().GetParameters().Length == 1)
                );

            foreach (var property in properties)
                yield return new EmitPropertyInfo(
                    property,
                    CreatePropertyGet(property),
                    CreatePropertySet(property)
                );
        }

        static Func<object, object> CreatePropertyGet(PropertyInfo pi)
        {
            var getMethod = pi.GetGetMethod();

            if (getMethod == null)
                return src =>
                {
                    throw new InvalidOperationException(
                        string.Format(
                            "Getter for property {0}.{1} not found",
                            pi.DeclaringType.FullName,
                            pi.Name
                        )
                    );
                };

            var method = new DynamicMethod(
                GetDynamicMethodName(pi, "Get"),
                typeof(object),
                new[] { typeof(object) },
                pi.Module
            );

            var il = method.GetILGenerator();

            il.Emit(OpCodes.Ldarg_0);
            if (pi.DeclaringType.IsValueType)
                il.Emit(OpCodes.Unbox, pi.DeclaringType);
            else
                il.Emit(OpCodes.Castclass, pi.DeclaringType);

            il.EmitCall(OpCodes.Callvirt, getMethod, null);

            if (pi.PropertyType.IsValueType)
                il.Emit(OpCodes.Box, pi.PropertyType);

            il.Emit(OpCodes.Ret);

            return (Func<object, object>)method.CreateDelegate(typeof(Func<object, object>));
        }

        static Action<object, object> CreatePropertySet(PropertyInfo pi)
        {
            var setMethod = pi.GetSetMethod();

            if (setMethod == null)
                return (src, value) =>
                {
                    throw new InvalidOperationException(
                        string.Format(
                            "Setter for property {0}.{1} not found",
                            pi.DeclaringType.FullName,
                            pi.Name
                        )
                    );
                };

            var method = new DynamicMethod(
                GetDynamicMethodName(pi, "Set"),
                typeof(void),
                new[] { typeof(object), typeof(object) },
                pi.Module
            );

            var il = method.GetILGenerator();

            il.Emit(OpCodes.Ldarg_0);
            if (pi.DeclaringType.IsValueType)
                il.Emit(OpCodes.Unbox, pi.DeclaringType);
            else
                il.Emit(OpCodes.Castclass, pi.DeclaringType);

            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Unbox_Any, pi.PropertyType);

            il.EmitCall(OpCodes.Callvirt, setMethod, null);

            il.Emit(OpCodes.Ret);

            return (Action<object, object>)method.CreateDelegate(typeof(Action<object, object>));
        }

        static string GetDynamicMethodName(PropertyInfo pi, string suffix)
        {
            return string.Join(
                "/",
                typeof(EmitTypeInfo).FullName,
                pi.DeclaringType.FullName,
                pi.Name,
                suffix
            );
        }
    }

    class EmitPropertyInfo
    {
        public PropertyInfo Property { get; private set; }
        public Func<object, object> GetValue { get; private set; }
        public Action<object, object> SetValue { get; private set; }

        public EmitPropertyInfo(
            PropertyInfo property,
            Func<object, object> getValue,
            Action<object, object> setValue
        )
        {
            Property = property;
            GetValue = getValue;
            SetValue = setValue;
        }
    }

Ну и пример вызова:
Код: plaintext
1.
2.
3.
4.
var obj = new MyClass();
var property = EmitTypeInfo.FindProperty("MyProperty");
property.SetValue(obj, 128); // запись
object value = property.GetValue(obj); // чтение
...
Рейтинг: 0 / 0
10.10.2011, 06:02
    #37474965
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Алексей КНу и пример вызова:
Код: plaintext
1.
2.
3.
4.
var obj = new MyClass();
var property = EmitTypeInfo.FindProperty("MyProperty");
property.SetValue(obj, 128); // запись
object value = property.GetValue(obj); // чтение
Ошибочка :-)

Код: plaintext
1.
2.
3.
4.
var obj = new MyClass();
var property = EmitTypeInfo.FindProperty(obj.GetType(), "MyProperty");
property.SetValue(obj, 128); // запись
object value = property.GetValue(obj); // чтение
...
Рейтинг: 0 / 0
10.10.2011, 10:36
    #37475121
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Алексей КА дальше используем эту заготовку как обычный рефлекшен везьде где нужно динамически обращаться к свойствам.
Ну а в чём тогда "величие" по сравнению с родной и любимой всеми рефлекторикой? ;)
...
Рейтинг: 0 / 0
10.10.2011, 10:39
    #37475132
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
МСУАлексей КА дальше используем эту заготовку как обычный рефлекшен везьде где нужно динамически обращаться к свойствам.
Ну а в чём тогда "величие" по сравнению с родной и любимой всеми рефлекторикой? ;)Я имел ввиду похожий API: PropertyInfo => EmitPropertyInfo.
...
Рейтинг: 0 / 0
10.10.2011, 10:43
    #37475143
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Алексей КМСУПо теме: 10281093 Reflection - не наш метод. Взрослые дядьки делают через Emit.

Код: plaintext
static Func<object, object> CreatePropertyGet(PropertyInfo pi)
...
Код: plaintext
static Action<object, object> CreatePropertySet(PropertyInfo pi)
...
Код: plaintext
static string GetDynamicMethodName(PropertyInfo pi, string suffix)
...
Код: plaintext
1.
2.
class EmitPropertyInfo
{
    public PropertyInfo Property { get; private set; }
...
Код: plaintext
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)

Браво, Алексей, браво! :)

Алексей КНу а в чём тогда "величие" по сравнению с родной и любимой всеми рефлекторикой? ;)Я имел ввиду похожий API: PropertyInfo => EmitPropertyInfo.[/quot]
См. выше :)
...
Рейтинг: 0 / 0
10.10.2011, 10:47
    #37475153
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public static TValue GetOrAddValue<TKey, TValue>(
    this Dictionary<TKey, TValue> src,
    TKey key,
    Func<TValue> getNewValue)
{
    TValue result;
    if (src.TryGetValue(key, out result) == false)
    {
        result = getNewValue();
        src.Add(key, result);
    }
    return result;
}

Дробовик доставать?
...
Рейтинг: 0 / 0
10.10.2011, 10:49
    #37475162
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
МСУДробовик доставать?Ничего не могу с собой поделать. Однажды наступил момент органического неприятия оператора логического отрицания "!" из-за его ненаглядности. Продолжаю с собой бороться, пока безрезультатно.
...
Рейтинг: 0 / 0
10.10.2011, 10:53
    #37475170
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq и SqlDataReader
МСУСм. выше :)Как бэ речь идёт о том, чтобы избежать вызова PropertyInfo.GetValue и PropertyInfo.SetValue. То что приведено выше - вызывается однократно при первом обращении, кэшируется. Вы походу не в теме решаемой тут задачи. :-)
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq и SqlDataReader / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]