Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF6 динамическое применение условий во всех таблицах / 25 сообщений из 222, страница 1 из 9
08.11.2018, 17:20
    #39730060
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Я использую EF6 db first. в модель данных загружено несколько таблиц в каждой из которых имеется столбец [user],
необходимо реализовать возможность динамического получения всех доступных таблиц в datacontext,каждой из них прописать условие

datacontext.t1.Where(row=>row.User=="user")
datacontext.t2.Where(row=>row.User=="user")
datacontext.t3.Where(row=>row.User=="user")

но заранее не зная о t1,t2 и t3
c помощью строки
Код: c#
1.
var tempTable=datacontext.GetType().GetProperty("t1").GetValue(datacontext, null)


я получаю экземпляр таблицы t1, но у меня не получается применить к нему linq запрос
Код: c#
1.
tempTable.Where(row=>row.User=="user")


не сработает, так как для where требуется IQuariable<TSource>, tempTable я могу преобразовать только в IQuariable.
подскажите как указать TSource, если по факту его нужно получить динамически, но я не знаю как
...
Рейтинг: 0 / 0
08.11.2018, 17:34
    #39730072
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
навесь (с помощью partial классов) на эти сущности интерфейс IUser, в котором будет свойство string User

дальше можно запрашивать через тип
Код: c#
1.
datacontext.Set<T1Type>.Cast<IUser>().Where(row=>row.User=="user")
...
Рейтинг: 0 / 0
08.11.2018, 17:36
    #39730073
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Соответственно, если тип будет заведомо IUser (например чрез констрейнты), то и Cast не потребуется
...
Рейтинг: 0 / 0
08.11.2018, 21:49
    #39730154
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Shocker.Proнавесь (с помощью partial классов) на эти сущности интерфейс IUser, в котором будет свойство string User

дальше можно запрашивать через тип
Код: c#
1.
datacontext.Set<T1Type>.Cast<IUser>().Where(row=>row.User=="user")



А что такое T1Type и где его брать? в этом основной вопрос
...
Рейтинг: 0 / 0
08.11.2018, 21:54
    #39730157
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Это тип, набор которых возвращает datacontext.t1

Всё зависит от того, где ты берешь строку "t1". Возможно, там следует переделать, чтобы этот код оперировал типами, а не строками, и вообще - строковое представление свойства - плохой путь, как правило.

А если нужно тупо все таблицы перебрать - то тут достаточно просто перебрать все типы, реализующие IUser
...
Рейтинг: 0 / 0
08.11.2018, 22:18
    #39730161
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Shocker.Pro,

Идея в том что я заранее не знаю ни количества таблиц ни их название, знаю только что в каждой есть столбец USER. Я перебираю все таблицы в contexte, но вот как потом к ним обращаться я не понимаю. Через GetValue я получаю DbSet, но в виде object, и мне не ясно как преобразовать из него в класс к которому можно будет сделать запрос where
...
Рейтинг: 0 / 0
08.11.2018, 22:22
    #39730166
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
lex452,
View если доступ к базе есть
...
Рейтинг: 0 / 0
08.11.2018, 22:26
    #39730169
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Petro123lex452,
View если доступ к базе есть
Можно поподробнее? доступ есть
...
Рейтинг: 0 / 0
08.11.2018, 22:28
    #39730170
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Хорошо, но ты можешь по формальному признаку выделить все классы Entity? Например по неймспейсу? Если да - ты можешь их перебрать, дергая каждый раз datacontext.Set<T1Type>, тебе не нужно перебирать свойства контекста для этого.

Далее, ты получаешь DbSet<TypeN>. И если ты не хочешь воспользоваться моим советом сделать интерфейс IUser, ну можно тогда приделать динамический фильтр Where
...
Рейтинг: 0 / 0
08.11.2018, 22:30
    #39730171
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Shocker.Proну можно тогда приделать динамический фильтр WhereПримерно так

Код: c#
1.
.Where(ExpressionWhereOneField("user", "User"))



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
		/// <summary>
		/// Составляет выражение для фильтрации по указанному полю
		/// </summary>
		public static Expression<Func<T, bool>> ExpressionWhereOneField<T>(object value, string fieldName)
		{
			var param = Expression.Parameter(typeof(T));
			return
			  Expression.Lambda<Func<T, bool>>(
				 Expression.Equal(
					Expression.Property(
					  param,
					  fieldName
					  ),
					Expression.Constant(value)
					),
				 param
				 );
		}
...
Рейтинг: 0 / 0
08.11.2018, 22:33
    #39730172
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Shocker.Pro,

Опять повторюсь, но я не понимаю что такое T1Type, и откуда мне его взять. Таблицы у меня разноформатные, но есть общий набор столбцов, если это конечно важно.
...
Рейтинг: 0 / 0
08.11.2018, 22:37
    #39730173
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
lex452Опять повторюсь, но я не понимаю что такое T1Type, и откуда мне его взять.Это тип Entity. Тип записи в твоей таблице. Тип, который находится внутри угловых скобочек в твоем IQueryable<>. Так понятно?

Где взять я уже писал. Либо к ним всем приделать интерфейс IUser, а потом выбрать все типы, реализующие этот интерфейс. Либо тупо перебрать все типы, находящиеся в определенном неймспейсе, если в нем нет ничего, кроме нужных тебе Entity
...
Рейтинг: 0 / 0
08.11.2018, 22:39
    #39730175
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
lex452не сработает, так как для where требуется IQuariable<TSource>,О, вот.
T1Type - это твой TSource для таблицы "t1"
...
Рейтинг: 0 / 0
08.11.2018, 22:39
    #39730176
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
lex452Petro123lex452,
View если доступ к базе есть
Можно поподробнее? доступ естья делал в постгри.
Select к системной табле где имена таблиц.
Формируется вьюха
Select user from t1
Union all
Select user from t2
...
...
Рейтинг: 0 / 0
08.11.2018, 22:41
    #39730177
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Или какой там тебе кортеж нужен в итоге?
...
Рейтинг: 0 / 0
08.11.2018, 22:41
    #39730178
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Petro123lex452пропущено...

Можно поподробнее? доступ естья делал в постгри.
Select к системной табле где имена таблиц.
Формируется вьюха
Select user from t1
Union all
Select user from t2
...

Это не выход, как я уже писал таблицы не одинаковые и фильтровать нужно каждую по отдельности
...
Рейтинг: 0 / 0
08.11.2018, 22:43
    #39730179
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Shocker.Prolex452не сработает, так как для where требуется IQuariable<TSource>,О, вот.
T1Type - это твой TSource для таблицы "t1"
Логически я это понимаю, но как его вытащить из контекста я не понимаю
...
Рейтинг: 0 / 0
08.11.2018, 22:46
    #39730181
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
lex452но как его вытащить из контекстаВ принципе, его можно вытащить и из контекста с помощью рефлексии, разобрав твое .GetProperty("t1")
Только сначала объясни, чем тебе не нравятся два других способа?
...
Рейтинг: 0 / 0
08.11.2018, 22:49
    #39730184
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
С интерфейсом и фильтром я согласен, буду пробовать. Но как использовать datacontext.Set<T1Type> если я в текущий момент не знаю T1Type, я не понимаю.
Или про какие 2 других способа речь мне не понятно
...
Рейтинг: 0 / 0
08.11.2018, 22:50
    #39730185
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Если не сложно приведите пример
...
Рейтинг: 0 / 0
08.11.2018, 22:53
    #39730187
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
lex452Если не сложно приведите пример ну приведи пример двух твоих Entity (вместе с неймспейсами), чтобы можно было говорить предметно, используя твои конкретные наименования, а то как-то абстрактными словами у меня не получается донести
...
Рейтинг: 0 / 0
08.11.2018, 22:57
    #39730188
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Shocker.Pro,

public class MyDbContext : DbContext
{
public virtual DbSet<t1Row> t1{ get; set; }
public virtual DbSet<t2Row> t2{ get; set; }
public virtual DbSet<t3Row> t3{ get; set; }
}

кусок контекста

нужно пробежаться по всем DbSet
...
Рейтинг: 0 / 0
08.11.2018, 22:57
    #39730189
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
lex452Это не выход, как я уже писал таблицы не одинаковые и фильтровать нужно каждую по отдельностивсе что делает linq можно сделать на sql.
КОНКРЕТНЕЕ
...
Рейтинг: 0 / 0
08.11.2018, 22:58
    #39730192
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
lex452нужно пробежаться по всем DbSetзачем?
...
Рейтинг: 0 / 0
08.11.2018, 23:00
    #39730193
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF6 динамическое применение условий во всех таблицах
Petro123lex452нужно пробежаться по всем DbSetзачем?
для отображения пользователю данных отфильтрованных по столбцу User.


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


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