powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq выбрать значение по имени колонки таблицы
12 сообщений из 12, страница 1 из 1
Linq выбрать значение по имени колонки таблицы
    #38646313
Sanprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно есть таблица бд, у нее есть колонки, для примера возьмем Column1, Column2, Column3 значения в этих колонках все стринговые. У меня есть процедура в которую передается стринговое название одной из колонок, теперь мне нужно выбрать список значение в linq запросе, зная только имя колоки

Код: c#
1.
2.
3.
4.
5.
6.
7.
void getList(string colName)
{
//......
from t in db.tmpTbl
select t.(вот здесь как-то подставить colName)
//.........
}
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646329
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фишка Linq в том, чтобы именно так не делать.
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646348
Sanprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, похоже сработал метод желтого утенка http://lifehacker.ru/2011/11/30/rubber-duck/
на случай если кому пригодится
Код: c#
1.
2.
3.
4.
5.
6.
7.
void getList(string colName)
{
//......
from t in db.tmpTbl
select new { MyNewCol = t.GetType().GetProperty( colName ).GetValue( t, null ) }
//.........
}
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646481
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sanprof,
это последний довод королей, и применять его надо в исключительных случаях
1 - если у вас название проперти изменится ( а при рефакторинге в порядке вещей)
вся ваша программа войдет в штопор
2 - получение значения через рефлектор происходит дольше примерно в 70 раз на одно значение.

если вы хотите менять выражение селектора ведь можно классически:
Код: c#
1.
2.
3.
4.
          void getList<T>(IQueryable<T> queryable, Expression<Func<T, Object>> selector)
        {
             queryable.Select(selector);
        }
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646563
Sanprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,
Спасибо за вариант, но я не совсем разобрался с selector как его сформировать в моем случае.

По поводу ошибок при изменении имени колонки таблицы, в принципе у меня так код написан, что colName берется определенным образом из списка, сформированного при старте из имен колонок этой таблицы.
То что рефлектор работает медленно это я знаю, но вариантов до этого не было.
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646588
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sanprof,
в угол не ставили что ли в детстве?
да ка то так
Код: c#
1.
 getList(db.tmpTbl ,a=>new {name=a.Column1});
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646597
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sanprof,
авторПо поводу ошибок при изменении имени колонки таблицы, в принципе у меня так код написан, что colName берется определенным образом из списка, сформированного при старте из имен колонок этой таблицы.
гы, ну и зачем эта петля Нестерова в коде, пошлите стринговые наименования нах..
если что то надо замаркировать, пользуйтесь атрибутами
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646692
Sanprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степиSanprof,
в угол не ставили что ли в детстве?
да ка то так
Код: c#
1.
 getList(db.tmpTbl ,a=>new {name=a.Column1});


хм, а если еще одна колонка добавиться (такой алгоритм, что это можно будет сделать без меня), это мне надо код будет править.
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646727
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sanprof,
есть да варианта, задать експрессию декларативно ( как я показал)
а применительно к стрингам через if or swith ( конечно править надо в ручную) ( и желательно в одном месте)
или построить выражение експерессии на лету, подав в построитель массив названий пропертей.
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38646836
Sanprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот нашел интересное решение, мне подходит
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38669159
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sanprof,
кабы форум оживить
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  static class Helper
    {
        public static IEnumerable<object> SelectAsDynamicObject<T>(this IEnumerable<T> enumerable,
            params string[] propertyName)
        {
            var sb = new StringBuilder("new(");
            foreach (var s in propertyName)
                sb.AppendFormat("it.{0}{1}", s, s == propertyName.Last() ? "" : ",");
            sb.Append(")");
            var parsedExpression = (Expression<Func<T, Object>>)System.Linq.Dynamic.DynamicExpression.
                ParseLambda(new[] { Expression.Parameter(typeof(T)) }, typeof(object), sb.ToString());
            return enumerable.AsQueryable().Select(parsedExpression).AsEnumerable();
        }
    }
/............................................/
 var a = new List<KeyValuePair<int, string>>() { new KeyValuePair<int, string>(1, "sdsd"), new KeyValuePair<int, string>(2, "sdsd") };
            foreach (dynamic o in a.SelectAsDynamicObject("Key", "Value"))
            {
                Console.WriteLine(o.Key);
            }
...
Рейтинг: 0 / 0
Linq выбрать значение по имени колонки таблицы
    #38669944
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще мысль выложу..

Код: c#
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.
 class Program
    {
        static void Main(string[] args)
        {
          
            var stopWatch = new Stopwatch();
            var body = new Body { Id = 3, Ass = 34 };
           
           
            var dfForId = GetFunc<Body, int>("Id");
            var dfForAss = GetFunc<Body, int>("Ass");

            var dd = body.GetType().GetProperty("Id");
            stopWatch.Start();
            for (var i = 0; i < 100000; i++)
            {
                //var ass = dfForAss(body);
                var res = dfForId(body); // dd.GetValue(body,null); //body.IsId;
                
            }
            stopWatch.Stop();
            Console.WriteLine(stopWatch.Elapsed);
        }

        static Func<TBody, int> GetFunc<TBody, TR>(string pName)
        {
            var parsedExpression = (Expression<Func<TBody, int>>)System.Linq.Dynamic.DynamicExpression.
               ParseLambda(new[] { Expression.Parameter(typeof(TBody), "x") }, typeof(TR), string.Concat("x.", pName));
            return parsedExpression.Compile();
        }
    }

    public class Body
    {
        public int Id { get; set; }
        public int Ass { get; set; }
    }

...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq выбрать значение по имени колонки таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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