Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Динамический linq  [new]
Дядя Коля
Member

Откуда:
Сообщений: 130
как сделать чтобы выборку из таблицы делать динамически?
обычно пишем например так
db.data.where(d => d.id == 5)

а хотелось бы чтобы таблица была переменной
func (string table)
{
db.getfromtable("table").where(d => d.id == 5)
}

getfromtable это я придумал вымышленный метод
7 мар 18, 20:06    [21244012]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
hVostt
Member

Откуда:
Сообщений: 14744
Дядя Коля,

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

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

никак.
7 мар 18, 20:12    [21244024]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
Дядя Коля
getfromtable это я придумал вымышленный метод
перелогинься)
7 мар 18, 21:22    [21244104]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
love_bach
Member

Откуда:
Сообщений: 376
Дядя Коля
как сделать чтобы выборку из таблицы делать динамически?
обычно пишем например так
db.data.where(d => d.id == 5)

а хотелось бы чтобы таблица была переменной
func (string table)
{
db.getfromtable("table").where(d => d.id == 5)
}

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


Cделать динамическую фильтрацию к фиксированной таблице имеет смысл - куча примеров в ынтырнете. А вот делать "статическую" фильтрацию к непонятно какой таблице... (разве что по Id). Возможно, Вам требуется не "выборку из таблицы делать динамически", а что-то типа Repository<T>.Get(long id)
10 мар 18, 15:04    [21246937]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
love_bach
А вот делать
про это и разговор.
Чел пилит универсальную модель для всего на свете (коммунизм).
Это утопия.
10 мар 18, 19:43    [21247153]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Дядя Коля
Member

Откуда:
Сообщений: 130
hVostt
Дядя Коля,

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

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

никак.

в этих таблицах будут гарантированные колонки типа id name, их достаточно
12 мар 18, 12:02    [21249085]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
Дядя Коля,
Linq без EF не имеет смысла.
А ОРМ EF склейкой строк запроса и динамическим sql не занимается.
В любой ветке по бд тебе скажут что диамическй sql это зло.
12 мар 18, 12:57    [21249361]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Дядя Коля
Member

Откуда:
Сообщений: 130
Petro123
Дядя Коля,
Linq без EF не имеет смысла.
А ОРМ EF склейкой строк запроса и динамическим sql не занимается.
В любой ветке по бд тебе скажут что диамическй sql это зло.

ну вот есть разные сущности и для них нужно сделать иерархию (связки родитель-сын) и если не использовать динамический то надо кучу кода дублировать, колонки дублировать, а динамически будет одна таблица связей, один код.
12 мар 18, 13:01    [21249382]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
Дядя Коля,
Схема где?
База должна быть не тупая. С pk, fk, cascade.
Тогда и ОРМ работает.
Если у вас эксель, то ССЗБ.
12 мар 18, 13:24    [21249516]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
oaken
Member

Откуда: Kiev
Сообщений: 490
Дядя Коля
в этих таблицах будут гарантированные колонки типа id name, их достаточно
В чем проблема вынести этот id в базовый класс для всех бизнес-объектов?
13 мар 18, 10:41    [21252033]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Дядя Коля
Member

Откуда:
Сообщений: 130
oaken
Дядя Коля
в этих таблицах будут гарантированные колонки типа id name, их достаточно
В чем проблема вынести этот id в базовый класс для всех бизнес-объектов?

ну это отдельная таблица чтоли будет? в codefirst
13 мар 18, 11:52    [21252343]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
oaken
Дядя Коля
в этих таблицах будут гарантированные колонки типа id name, их достаточно
В чем проблема вынести этот id в базовый класс для всех бизнес-объектов?
в том что наследования в базе нету. Там нет ООП.
Теоретически есть, но....
13 мар 18, 12:51    [21252509]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 916
Petro123
oaken
пропущено...
В чем проблема вынести этот id в базовый класс для всех бизнес-объектов?
в том что наследования в базе нету. Там нет ООП.
Теоретически есть, но....


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

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

Он со своими объектами уже будет работать через базовый класс - и всё будет ок.
16 мар 18, 00:32    [21260177]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 916
Дядя Коля
oaken
пропущено...
В чем проблема вынести этот id в базовый класс для всех бизнес-объектов?

ну это отдельная таблица чтоли будет? в codefirst


Нет. Как ты себе это представляешь? ООП отдельно - Таблицы в БД отдельно.
16 мар 18, 00:33    [21260178]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 916
Дядя Коля
hVostt
Дядя Коля,

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

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

никак.

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


Только на будущее рекомендовал бы сделать базовый класс с ID, от него отнаследовать NAME, а от этого уже всё остальное.
16 мар 18, 00:35    [21260180]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
Агнец за бортом,
Т.е. вы одобрямс вот это:
db.getfromtable("table")....?
ОК.
Пусть делает).
16 мар 18, 07:16    [21260262]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 916
Petro123
Агнец за бортом,
Т.е. вы одобрямс вот это:
db.getfromtable("table")....?
ОК.
Пусть делает).


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

repo.getFromTable<Т>().where....
16 мар 18, 07:31    [21260272]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
Агнец за бортом,
Да. Но это уже не совсем ОРМ классика и EF.
Как динамический sql со склейкой строк чётко отличается от обычного sql.
Это недалеко ушло от:
context.db.connection.command.runSql("select aaaaaaa..
Паттерны есть на всё. Даже на Г.код. (с)
))) Имхо
16 мар 18, 08:01    [21260304]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 916
Petro123,

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

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

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

"Нет, пока один работаю"))
16 мар 18, 08:07    [21260310]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
Агнец за бортом,
Ну дак
ContextDb.ИмяСущности
Проще наверно для программирования чем репо?
2. EF отслеживает изменения при репо?
16 мар 18, 08:32    [21260341]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 916
Petro123
Агнец за бортом,

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


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

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

Не скажу, что мой код репозитория прямо 500 кило, но экрана два кода он занимает.
16 мар 18, 09:10    [21260409]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
Агнец за бортом
EF никуда не девается, репо - это просто обёртка вокруг EF.
на хабре флеймов полно - занафига делать обертку, если паттерн уже внутри EF.

Агнец за бортом
просто в приличных домах работа с бд - это не только получение списка.

Согласен. Только я начинаю от простого к сложному.
И тут не понимаю, как можно писать ИС не зная заранее имя таблицы, сущности и предметной области.
А если знаем, то:
Context. И после точки они появляются.
Никакой динамики.
...
Хотя вы правы, жизнь сложнее в общих случаях.
16 мар 18, 09:49    [21260542]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4510
Дядя Коля,
как то так
 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;
        }
16 мар 18, 12:11    [21261054]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34620
ЕвгенийВ,
А потом к нему
GetFieldByName()
))
16 мар 18, 12:19    [21261094]     Ответить | Цитировать Сообщить модератору
 Re: Динамический linq  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4510
Petro123
ЕвгенийВ,
А потом к нему
GetFieldByName()
))

В автоматической кодогенерации нормальная тема
16 мар 18, 13:02    [21261274]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить