powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Можно ли такое сделать?
19 сообщений из 19, страница 1 из 1
Можно ли такое сделать?
    #39084341
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли как-то сделать вот такое?:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 try
            {
                Type objectType = Type.GetType("Type." + type.ToString() + ", Assembly", true);
                data = _myDbContext.Set<objectType >.Where(w => w.Id == id).FirstOrDefault();
                return data;
            }
            catch (TypeLoadException e)
            {
            }
            catch (Exception e)
            {
            }
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084370
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, конечно.

Во-первых, для обобщенных методов параметр типа должен быть известен на этапе компиляции, а не в процессе выполнения.
Во вторых, есть необобщенный DbContext.Set, в данном случае будет data = _myDbContext.Set(objectType)

Но для того, чтобы дальше с ним работать, например с Id, его надо привести к походящему интерфейсу, например
Код: c#
1.
2.
3.
4.
public interface IHasID
{
  int Id { get; set; }
}


и пусть нужные сущности его наследуют
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084377
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Все так определен контекст и метод в самом контексте:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public interface IDbContext : IDisposable
    {
        IQueryable<T> Set<T>() where T : class;
        int SaveChanges();
    }


    IQueryable<T> IDbContext.Set<T>()
    {
            return Set<T>();
    }



Как тогда убрать вот такой кейс?:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
switch (type)
            {
                case TypeObjectEnum.CE:
                    return _dbContext.Set<Type1>().Where(w => w.id== id).Select(s => s.id);
                    break;
                case TypeObjectEnum.ICE:
                    return _dbContext.Set<Type2>().Where(w => w.id== id).Select(s => s.id);
                    break;
                case TypeObjectEnum.DD:
                    return _dbContext.Set<Type3>().Where(w => w.id== id).Select(s => s.id);
                    break;
                case TypeObjectEnum.IVR:
                    return _dbContext.Set<Type4>().Where(w => w.id== id).Select(s => s.id);
                    break;
                case TypeObjectEnum.ID:
                    return _dbContext.Set<Type5>().Where(w => w.id== id).Select(s => s.id);
                    break;
                default:
                    return null;
                    break;
            }
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084441
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я написал выше, мне нечего добавить.
Используй Set(Type) вместо Set<T>()
Сущности объяви с интерфейсом IHasId
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084645
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

А смысл городить еще один интерфейс, если можно написать так:

Код: c#
1.
2.
3.
4.
        T IDbContext.GetById<T>(Guid id)
        {
            return this.Set<T>().Find(id);
        }
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084683
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaА смысл городить еще один интерфейсну ты ведь в своем свиче так не написал.
Кроме того, интерфейс может понадобиться не только для поиска одного объекта по id
И параметр типа ты все равно не можешь задать.
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084776
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Мне важно понять, можно как-то получить вот это

Код: c#
1.
_myDbContext.Set<objectType >



Потому что у меня более 30 объектов и придется писать огромный switch. Не хочется
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084824
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluhaможно как-то получить вот этоЭТО получить нельзя, я ответил еще в первом сообщении. Но вот твою задачу можно решить иначе. В том числе можно динамически состряпать Expression для отбора по Id. Но интерфейс проще и удобнее.
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084844
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно я не так описал задачу.

У меня есть очень много объектов, для которых необходимо выполнить стандартный набор команд, как мне кажется, это можно сделать через Generic.

Список команд
1. Получение списка идентификаторов объекта
2. Получение объекта по идентификатору

Список сущностей за 30. Писать тупой switch на все объекты жесткачь

На входе каждого метода приходит тип запрашиваемого объекта.
Вот я и подумал, что было бы клево как-то свести все к такому:
Код: c#
1.
2.
  Type objectType = Type.GetType("Type." + type.ToString() + ", Assembly", true);
  data = _myDbContext.Set<objectType>.GetById(id);



Отсюда вопрос, как бы извернуться, чтобы такое сделать
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084856
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

А какой вариант есть альтернативный?
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084885
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, ты не понимаешь. Ни через свич, ни каким либо другим способом ты не сможешь использовать дженерик для динамически создаваемого типа. По определению.

А коль ты заранее (при компиляции) не можешь знать, какого типа будет переменная, ты не можешь эту переменную и объявить. Поэтому
Pavluha2. Получение объекта по идентификаторуты можешь получишь этот объект, но это будет либо object, либо более узкий тип, определенный интерфейсами, но никак не конкретный, ибо, повторю, заранее ты этот тип не знаешь.

Определись с тем, что ты собираешься делать дальше с результатами выполнения этих методов:
Pavluha1. Получение списка идентификаторов объекта
2. Получение объекта по идентификатору
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084896
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Отдавать клиенту
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084905
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и отдавай ему object
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39084942
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Я же написал, что проблема в множественном кейсе.

У меня все работает, просто не нравится такое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
switch (type)
            {
                case TypeObjectEnum.CE:
                    data = _dbContext.GetById<Type1>(id);
                    break;
                case TypeObjectEnum.ICE:
                    data = _dbContext.GetById<Type1>(id);
                    break;
                case TypeObjectEnum.DD:
                    data = _dbContext.GetById<Type1>(id);
                    break;
            }



и такое

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
switch (type)
            {
                case TypeObjectEnum.CE:
                    return _dbContext.Set<Type1>().Select(s => s.id1).Take(10);
                    break;
                case TypeObjectEnum.ICE:
                    return _dbContext.Set<Type2>().Select(s => s.id2).Take(10);
                    break;
                case TypeObjectEnum.DD:
                    return _dbContext.Set<Type3>().Select(s => s.id3).Take(10);
                    break;
                case TypeObjectEnum.IVR:
                    return _dbContext.Set<Type4>().Select(s => s.id4).Take(10);
                    break;
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39085032
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять за рыбу деньги.
Не нравится свич - используй DbContext.Set(Type) вместо DbContext.Set<T>()
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39085182
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Да, спасибо этот вариант работает.
Очень компактно получилось.

У меня теперь другой вопрос. Вы упомянули об общем интерфейсе IHasID.
Я немного не пойму, как его мне использовать.
В самой сущности я сделал приведение
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class ActionProcess : ObjectData,  IHasID
{
        public Guid IdActionProcess { get; set; }
        public Guid Id
        {
            get { return IdActionProcess; }
        }

}



Вопрос вот какой. Как это использовать вот тут и написать компактно:
Код: c#
1.
            var set = _corpControlDbContext.Set(Type.GetType("Type." + type.ToString() + ", Assembly", true));



Как теперь вытащить список идентификаторов данной сущности? Использую свойство интерфейса IHasID
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39085198
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как это заменить на что-то обобщенное:

Код: c#
1.
_dbContext.Set<ActionProcess>().Select(s => s.IdActionProcess);



Эту часть я получил _dbContext.Set<ActionProcess>() -> _dbContext.Set(Type.GetType("Type." + type.ToString() + ", Assembly", true));
Как теперь сделать Select?
...
Рейтинг: 0 / 0
Можно ли такое сделать?
    #39085222
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так:

Код: c#
1.
2.
3.
            IQueryable<IHasID> data = set as IQueryable<IHasID>;
            var ids = data.ToList().Select(s => s.Id);
            return ids;



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


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