Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Можно ли такое сделать? / 19 сообщений из 19, страница 1 из 1
23.10.2015, 09:47
    #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
23.10.2015, 10:14
    #39084370
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое сделать?
Нет, конечно.

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

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


и пусть нужные сущности его наследуют
...
Рейтинг: 0 / 0
23.10.2015, 10:20
    #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
23.10.2015, 11:19
    #39084441
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое сделать?
Я написал выше, мне нечего добавить.
Используй Set(Type) вместо Set<T>()
Сущности объяви с интерфейсом IHasId
...
Рейтинг: 0 / 0
23.10.2015, 13:06
    #39084645
Pavluha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое сделать?
Shocker.Pro,

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

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

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

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



Потому что у меня более 30 объектов и придется писать огромный switch. Не хочется
...
Рейтинг: 0 / 0
23.10.2015, 14:32
    #39084824
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое сделать?
Pavluhaможно как-то получить вот этоЭТО получить нельзя, я ответил еще в первом сообщении. Но вот твою задачу можно решить иначе. В том числе можно динамически состряпать Expression для отбора по Id. Но интерфейс проще и удобнее.
...
Рейтинг: 0 / 0
23.10.2015, 14:40
    #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
23.10.2015, 14:44
    #39084856
Pavluha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое сделать?
Shocker.Pro,

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

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

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

Отдавать клиенту
...
Рейтинг: 0 / 0
23.10.2015, 15:01
    #39084905
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое сделать?
ну и отдавай ему object
...
Рейтинг: 0 / 0
23.10.2015, 15:17
    #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
23.10.2015, 16:11
    #39085032
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое сделать?
Опять за рыбу деньги.
Не нравится свич - используй DbContext.Set(Type) вместо DbContext.Set<T>()
...
Рейтинг: 0 / 0
23.10.2015, 17:19
    #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
23.10.2015, 17:24
    #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
23.10.2015, 17:43
    #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
23.10.2015, 19:02
    #39085274
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое сделать?
треш у ТС в постановке задачи.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Можно ли такое сделать? / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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