Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Динамический linq / 25 сообщений из 39, страница 1 из 2
07.03.2018, 20:06
    #39612045
Дядя Коля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
как сделать чтобы выборку из таблицы делать динамически?
обычно пишем например так
Код: 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
07.03.2018, 20:12
    #39612049
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
Дядя Коля,

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

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

никак.
...
Рейтинг: 0 / 0
07.03.2018, 21:22
    #39612070
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
Дядя Коляgetfromtable это я придумал вымышленный методперелогинься)
...
Рейтинг: 0 / 0
10.03.2018, 15:04
    #39612791
love_bach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
Дядя Колякак сделать чтобы выборку из таблицы делать динамически?
обычно пишем например так
Код: 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
10.03.2018, 19:43
    #39612847
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
love_bachА вот делатьпро это и разговор.
Чел пилит универсальную модель для всего на свете (коммунизм).
Это утопия.
...
Рейтинг: 0 / 0
12.03.2018, 12:02
    #39613329
Дядя Коля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
hVosttДядя Коля,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Агнец за бортомпросто в приличных домах работа с бд - это не только получение списка.
Согласен. Только я начинаю от простого к сложному.
И тут не понимаю, как можно писать ИС не зная заранее имя таблицы, сущности и предметной области.
А если знаем, то:
Context. И после точки они появляются.
Никакой динамики.
...
Хотя вы правы, жизнь сложнее в общих случаях.
...
Рейтинг: 0 / 0
16.03.2018, 12:11
    #39615887
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
Дядя Коля,
как то так
Код: 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
16.03.2018, 12:19
    #39615894
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
ЕвгенийВ,
А потом к нему
GetFieldByName()
))
...
Рейтинг: 0 / 0
16.03.2018, 13:02
    #39615926
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический linq
Petro123ЕвгенийВ,
А потом к нему
GetFieldByName()
))
В автоматической кодогенерации нормальная тема
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Динамический linq / 25 сообщений из 39, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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