powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq и SqlDataReader
25 сообщений из 29, страница 1 из 2
Linq и SqlDataReader
    #37472652
artemius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем,

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

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

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

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

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

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

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

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

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

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

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

Не для слабонервных
Код: 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
Linq и SqlDataReader
    #37474965
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу и пример вызова:
Код: 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
Linq и SqlDataReader
    #37475121
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КА дальше используем эту заготовку как обычный рефлекшен везьде где нужно динамически обращаться к свойствам.
Ну а в чём тогда "величие" по сравнению с родной и любимой всеми рефлекторикой? ;)
...
Рейтинг: 0 / 0
Linq и SqlDataReader
    #37475132
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КА дальше используем эту заготовку как обычный рефлекшен везьде где нужно динамически обращаться к свойствам.
Ну а в чём тогда "величие" по сравнению с родной и любимой всеми рефлекторикой? ;)Я имел ввиду похожий API: PropertyInfo => EmitPropertyInfo.
...
Рейтинг: 0 / 0
Linq и SqlDataReader
    #37475143
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУПо теме: 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
Linq и SqlDataReader
    #37475153
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Linq и SqlDataReader
    #37475162
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУДробовик доставать?Ничего не могу с собой поделать. Однажды наступил момент органического неприятия оператора логического отрицания "!" из-за его ненаглядности. Продолжаю с собой бороться, пока безрезультатно.
...
Рейтинг: 0 / 0
Linq и SqlDataReader
    #37475170
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУСм. выше :)Как бэ речь идёт о том, чтобы избежать вызова PropertyInfo.GetValue и PropertyInfo.SetValue. То что приведено выше - вызывается однократно при первом обращении, кэшируется. Вы походу не в теме решаемой тут задачи. :-)
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq и SqlDataReader
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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