powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Динамический linq
39 сообщений из 39, показаны все 2 страниц
Динамический linq
    #39612045
Дядя Коля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как сделать чтобы выборку из таблицы делать динамически?
обычно пишем например так
Код: c#
1.
db.data.where(d => d.id == 5)


а хотелось бы чтобы таблица была переменной
Код: c#
1.
2.
3.
4.
func (string table)
{
db.getfromtable("table").where(d => d.id == 5)
}


getfromtable это я придумал вымышленный метод
...
Рейтинг: 0 / 0
Динамический linq
    #39612049
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коля,

обратившись к таблице по текстовому имени, не знаешь какой там тип, чтобы строить LINQ-запрос. невозможно написать такое условие Where(..).

другими словами, как мне пойти взять то, не знаю что, но по известному направлению.

никак.
...
Рейтинг: 0 / 0
Динамический linq
    #39612070
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коляgetfromtable это я придумал вымышленный методперелогинься)
...
Рейтинг: 0 / 0
Динамический linq
    #39612791
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Колякак сделать чтобы выборку из таблицы делать динамически?
обычно пишем например так
Код: c#
1.
db.data.where(d => d.id == 5)


а хотелось бы чтобы таблица была переменной
Код: c#
1.
2.
3.
4.
func (string table)
{
db.getfromtable("table").where(d => d.id == 5)
}


getfromtable это я придумал вымышленный метод

Cделать динамическую фильтрацию к фиксированной таблице имеет смысл - куча примеров в ынтырнете. А вот делать "статическую" фильтрацию к непонятно какой таблице... (разве что по Id). Возможно, Вам требуется не "выборку из таблицы делать динамически", а что-то типа Repository<T>.Get(long id)
...
Рейтинг: 0 / 0
Динамический linq
    #39612847
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachА вот делатьпро это и разговор.
Чел пилит универсальную модель для всего на свете (коммунизм).
Это утопия.
...
Рейтинг: 0 / 0
Динамический linq
    #39613329
Дядя Коля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДядя Коля,

обратившись к таблице по текстовому имени, не знаешь какой там тип, чтобы строить LINQ-запрос. невозможно написать такое условие Where(..).

другими словами, как мне пойти взять то, не знаю что, но по известному направлению.

никак.
в этих таблицах будут гарантированные колонки типа id name, их достаточно
...
Рейтинг: 0 / 0
Динамический linq
    #39613358
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коля,
Linq без EF не имеет смысла.
А ОРМ EF склейкой строк запроса и динамическим sql не занимается.
В любой ветке по бд тебе скажут что диамическй sql это зло.
...
Рейтинг: 0 / 0
Динамический linq
    #39613363
Дядя Коля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Дядя Коля,
Linq без EF не имеет смысла.
А ОРМ EF склейкой строк запроса и динамическим sql не занимается.
В любой ветке по бд тебе скажут что диамическй sql это зло.
ну вот есть разные сущности и для них нужно сделать иерархию (связки родитель-сын) и если не использовать динамический то надо кучу кода дублировать, колонки дублировать, а динамически будет одна таблица связей, один код.
...
Рейтинг: 0 / 0
Динамический linq
    #39613395
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коля,
Схема где?
База должна быть не тупая. С pk, fk, cascade.
Тогда и ОРМ работает.
Если у вас эксель, то ССЗБ.
...
Рейтинг: 0 / 0
Динамический linq
    #39613962
oaken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коляв этих таблицах будут гарантированные колонки типа id name, их достаточноВ чем проблема вынести этот id в базовый класс для всех бизнес-объектов?
...
Рейтинг: 0 / 0
Динамический linq
    #39614025
Дядя Коля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oakenДядя Коляв этих таблицах будут гарантированные колонки типа id name, их достаточноВ чем проблема вынести этот id в базовый класс для всех бизнес-объектов?
ну это отдельная таблица чтоли будет? в codefirst
...
Рейтинг: 0 / 0
Динамический linq
    #39614060
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oakenДядя Коляв этих таблицах будут гарантированные колонки типа id name, их достаточноВ чем проблема вынести этот id в базовый класс для всех бизнес-объектов?в том что наследования в базе нету. Там нет ООП.
Теоретически есть, но....
...
Рейтинг: 0 / 0
Динамический linq
    #39615695
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123oakenпропущено...
В чем проблема вынести этот id в базовый класс для всех бизнес-объектов?в том что наследования в базе нету. Там нет ООП.
Теоретически есть, но....

И тем не менее - вынести id в базовый класс - нормальная тема.

В базе нету наследования - оно там и не нужно.

Он со своими объектами уже будет работать через базовый класс - и всё будет ок.
...
Рейтинг: 0 / 0
Динамический linq
    #39615696
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коляoakenпропущено...
В чем проблема вынести этот id в базовый класс для всех бизнес-объектов?
ну это отдельная таблица чтоли будет? в codefirst

Нет. Как ты себе это представляешь? ООП отдельно - Таблицы в БД отдельно.
...
Рейтинг: 0 / 0
Динамический linq
    #39615698
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя КоляhVosttДядя Коля,

обратившись к таблице по текстовому имени, не знаешь какой там тип, чтобы строить LINQ-запрос. невозможно написать такое условие Where(..).

другими словами, как мне пойти взять то, не знаю что, но по известному направлению.

никак.
в этих таблицах будут гарантированные колонки типа id name, их достаточно

Только на будущее рекомендовал бы сделать базовый класс с ID, от него отнаследовать NAME, а от этого уже всё остальное.
...
Рейтинг: 0 / 0
Динамический linq
    #39615720
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,
Т.е. вы одобрямс вот это:
db.getfromtable("table")....?
ОК.
Пусть делает).
...
Рейтинг: 0 / 0
Динамический linq
    #39615722
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Агнец за бортом,
Т.е. вы одобрямс вот это:
db.getfromtable("table")....?
ОК.
Пусть делает).

Для целей ТС есть паттерн репозиторий и дженерики.

repo.getFromTable<Т>().where....
...
Рейтинг: 0 / 0
Динамический linq
    #39615727
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,
Да. Но это уже не совсем ОРМ классика и EF.
Как динамический sql со склейкой строк чётко отличается от обычного sql.
Это недалеко ушло от:
context.db.connection.command.runSql("select aaaaaaa..
Паттерны есть на всё. Даже на Г.код. (с)
))) Имхо
...
Рейтинг: 0 / 0
Динамический linq
    #39615729
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Не понимаю. Это EF. Типизация сохраняется и работает.

EF через контекст сама реализует доступ via generics.

Насчёт "классики"...

"Нет, пока один работаю"))
...
Рейтинг: 0 / 0
Динамический linq
    #39615735
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,
Ну дак
ContextDb.ИмяСущности
Проще наверно для программирования чем репо?
2. EF отслеживает изменения при репо?
...
Рейтинг: 0 / 0
Динамический linq
    #39615746
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Агнец за бортом,

2. EF отслеживает изменения при репо?

Мы с тобой о разных вещах наверное говорим. EF никуда не девается, репо - это просто обёртка вокруг EF.

EF сама предоставляет db.Set<entity>, так что можно и без репозитория, просто в приличных домах работа с бд - это не только получение списка.

Не скажу, что мой код репозитория прямо 500 кило, но экрана два кода он занимает.
...
Рейтинг: 0 / 0
Динамический linq
    #39615769
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомEF никуда не девается, репо - это просто обёртка вокруг EF.на хабре флеймов полно - занафига делать обертку, если паттерн уже внутри EF.

Агнец за бортомпросто в приличных домах работа с бд - это не только получение списка.
Согласен. Только я начинаю от простого к сложному.
И тут не понимаю, как можно писать ИС не зная заранее имя таблицы, сущности и предметной области.
А если знаем, то:
Context. И после точки они появляются.
Никакой динамики.
...
Хотя вы правы, жизнь сложнее в общих случаях.
...
Рейтинг: 0 / 0
Динамический linq
    #39615887
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коля,
как то так
Код: 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.
 public static IQueryable func(this DwhContext context, string table)
        {
            var type = context.GetType();
            var tab = type.GetProperty(table);
            var prop = tab.GetValue(context) as IQueryable;
            var e = prop.Expression;
            var t = prop.ElementType;
            var expr = MakeExpression(t);
            var qt = typeof(Queryable).GetMethods()
                .FirstOrDefault(x => x.Name == "Where" && x.GetParameters().Length == 2)
                .MakeGenericMethod(t);
            var res = Expression.Call(qt,e, expr);
            var tmp = Expression.Lambda(res).Compile().DynamicInvoke();
            return tmp as IQueryable;
        }
        static Expression MakeExpression(Type t)
        {
            var par = Expression.Parameter(t, "x");
            var id = t.GetProperty("Id");
            var left = Expression.MakeMemberAccess(par, id);
            var rigth = Expression.Constant(5);
            var body = Expression.Equal(left, rigth);
            var lambda = Expression.Lambda(body, par);
            return lambda;
        }
...
Рейтинг: 0 / 0
Динамический linq
    #39615894
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,
А потом к нему
GetFieldByName()
))
...
Рейтинг: 0 / 0
Динамический linq
    #39615926
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ЕвгенийВ,
А потом к нему
GetFieldByName()
))
В автоматической кодогенерации нормальная тема
...
Рейтинг: 0 / 0
Динамический linq
    #39615933
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,
Её уже сделали.
В штатном EF, в хибере, в биндинге AndroidStudio.
Т.к. когда при изменении модели или раздела биндинг в XML студия IDE генерит классы программисту.
...
Рейтинг: 0 / 0
Динамический linq
    #39615966
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ЕвгенийВ,
Её уже сделали.
В штатном EF, в хибере, в биндинге AndroidStudio.
Т.к. когда при изменении модели или раздела биндинг в XML студия IDE генерит классы программисту.
биндинг в XML в топку.
Я показал как решить поставленную задачу в не зависимости от ее вменяемости, скорее из академических целей, а не разглагольствовал о "великом".
...
Рейтинг: 0 / 0
Динамический linq
    #39615974
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВбиндинг в XML в топку. wpf в xaml.
Другого вроде нет. Может в шарпе по другому.....

ЕвгенийВЯ показал как решить поставленную задачу в не зависимости от ее вменяемости, скорее из академических целей, а не разглагольствовал о "великом".
Да. Это круто.
Удачи!
...
Рейтинг: 0 / 0
Динамический linq
    #39615982
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВДядя Коля,
как то так
Код: 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.
 public static IQueryable func(this DwhContext context, string table)
        {
            var type = context.GetType();
            var tab = type.GetProperty(table);
            var prop = tab.GetValue(context) as IQueryable;
            var e = prop.Expression;
            var t = prop.ElementType;
            var expr = MakeExpression(t);
            var qt = typeof(Queryable).GetMethods()
                .FirstOrDefault(x => x.Name == "Where" && x.GetParameters().Length == 2)
                .MakeGenericMethod(t);
            var res = Expression.Call(qt,e, expr);
            var tmp = Expression.Lambda(res).Compile().DynamicInvoke();
            return tmp as IQueryable;
        }
        static Expression MakeExpression(Type t)
        {
            var par = Expression.Parameter(t, "x");
            var id = t.GetProperty("Id");
            var left = Expression.MakeMemberAccess(par, id);
            var rigth = Expression.Constant(5);
            var body = Expression.Equal(left, rigth);
            var lambda = Expression.Lambda(body, par);
            return lambda;
        }



Этот лютый код служит цели - достать из произвольной таблицы сущность с id==5 ??
...
Рейтинг: 0 / 0
Динамический linq
    #39615985
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,

Забыл - достать сущность с id==5 для дяди Коли?

Или любой может её получить?
...
Рейтинг: 0 / 0
Динамический linq
    #39616014
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом
Этот лютый код служит цели - достать из произвольной таблицы сущность с id==5 ??
да.
...
Рейтинг: 0 / 0
Динамический linq
    #39616023
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВАгнец за бортомЭтот лютый код служит цели - достать из произвольной таблицы сущность с id==5 ??
да.

То есть правильней метод назвать на func, а

Код: c#
1.
public static IQueryable getEntityWithID5FromAnyTable(this DwhContext context, string table)



???
...
Рейтинг: 0 / 0
Динамический linq
    #39616027
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно для альтернативно одаренных - почему этого не достаточно?

Студию открыть не могу - окно ответа - моя IDE.

public static IQueryable func(this DwhContext context, string table)
{
var type = context.GetType();
var tab = type.GetProperty(table);
var t = tab.GetType();

return context.Set<t>()
}
...
Рейтинг: 0 / 0
Динамический linq
    #39616028
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public static IQueryable func(this DwhContext context, string table)
        {
            var type = context.GetType();
            var tab = type.GetProperty(table);
            var t = tab.GetType();

            return context.Set<t>()
        }



Сорри.
...
Рейтинг: 0 / 0
Динамический linq
    #39616036
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public static IQueryable func(this DwhContext context, string table)
        {
            var type = context.GetType();
            var tab = type.GetProperty(table);
            var t = tab.GetType();

            return context.Set<t>()
        }



Сорри.
Ты путаешь тип-параметр с экземпляром класса Type.
...
Рейтинг: 0 / 0
Динамический linq
    #39616049
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВТы путаешь тип-параметр с экземпляром класса Type.

То есть - generic-type из строки вообще не получить?
...
Рейтинг: 0 / 0
Динамический linq
    #39616083
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,
только нетипизированный
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public static IQueryable func(this DwhContext context, string table)
        {
            var type = context.GetType();
            var tab = type.GetProperty(table);
            var prop = tab.GetValue(context) as IQueryable;
            var t = prop.ElementType;

            var set = typeof(DbContext).GetMethod("Set")
                .MakeGenericMethod(t);
            return set.Invoke(context, null) as IQueryable;
        }
...
Рейтинг: 0 / 0
Динамический linq
    #39616092
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомТо есть - generic-type из строки вообще не получить?

А как из кода собираешься с этим работать?
...
Рейтинг: 0 / 0
Динамический linq
    #39616567
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а еще есть dynamic linq.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Динамический linq
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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