powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Динамический объект в Linq запросе
13 сообщений из 13, страница 1 из 1
Динамический объект в Linq запросе
    #37994561
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что имеем: 2 таблицы, запрос на выборку с JOIN.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public class Child
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Code { get; set; }
        public string CodeExtrac{ get; set; }
    }

....
                list = (from reference in NSI.Reference
                         join refitems in NSI.RefItems
                             on reference.Id equals refitems.Id
                         select {
                            Name = reference.Name,

                            ID = refitems.Id,
                            Code = refitems.CodeMain,
                            CodeExtra = refitems.CodeExtra
                           }).ToList<Child>();



Задача такая: динамически генерировать класс Child на основе сущности RefItems и добавлять поле Name из reference.

Подскажите, в какую сторону копать?
Спасибо.
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37994565
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Описался, вот запрос:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
                      list = (from reference in NSI.Reference
                         join refitems in NSI.RefItems
                             on reference.Id equals refitems.Id
                         select new Child{
                            Name = reference.Name,

                            ID = refitems.Id,
                            Code = refitems.CodeMain,
                            CodeExtra = refitems.CodeExtra
                           }).ToList<Child>();
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37995341
Sanitto!!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex.style,

Чет не понял, а в чем вопрос-то?
В данном запросе на выходе будет список объектов типа Child. Разве не оно надо?
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37995680
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, мне надо, чтобы на выходе результат остался тот же, но вот это
Код: c#
1.
2.
3.
4.
5.
6.
7.
                         select new Child {
                            Name = reference.Name,

                            ID = refitems.Id,
                            Code = refitems.CodeMain,
                            CodeExtra = refitems.CodeExtra
                           }



Заменить на что-нибудь вроде этого:
Код: c#
1.
                         select (refitems)(new Object {Name = reference.Name})
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37995725
Sanitto!!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex.style,

Мнэ, мнэ.. Ну, если я правильно понял задачу, то как-то так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var list = (from reference in NSI.Reference
                         join refitems in NSI.RefItems
                             on reference.Id equals refitems.Id
                         select new RefItems()
                         {
                               Name = reference.Name,
                               Id= refitems.Id,
                               CodeMain= refitems.CodeMain,
                               CodeExtra = refitems.CodeExtra
                           }).ToList<RefItems>();
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37995740
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я как раз и хочу избежать вот этих:
Код: c#
1.
2.
3.
4.
Name = reference.Name,
Id= refitems.Id,
CodeMain= refitems.CodeMain,
CodeExtra = refitems.CodeExtra



Присваивать хочу во всех случаях только одно поле: Name = reference.Name
Остальные поля я хочу брать из сущности refitems
Другими словами меня полностью устраивает select refitems если бы не поле Name в сущности reference

Эта сущность с течением времени может меняться. Следовательно, придется поддерживать изменения как в EDMX-файле, который генерится из БД, так и в самом коде.
Я привел только единичный случай. Полей может быть не 3, а, скажем, 50 !!!
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37995889
Sanitto!!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex.style,

Ну, вот так, к примеру:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
RefItems SetSomeName(RefItems rrr, string newName)
{
   rrr.Name = newName;
   return rrr;
}

var list = (from reference in NSI.Reference
                         join refitems in NSI.RefItems on reference.Id equals refitems.Id
                         select SetSomeName(refitems, reference.Name)).ToList();



Можно, конечно, еще в дебри улезть и поэкспериментировать с AsParallel().ForAll()..
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37996276
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доковырялся до подобного:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        private static dynamic SetNameAndGroupID(object objToExtend, string newName, int GroupID)
        {
            dynamic result = objToExtend;
            result.Name = newName;
            result.GroupID = GroupID;
            return result;
        }

        public void someshit(...params){
...
                var q = (from reference in NSI.Reference
                         join refitems in NSI.RefItems
                             on reference.ReferenceId equals refitems.ReferenceId
                         where (reference.RefGroupId == gpid)
                         select SetNameAndGroupID(refitems,reference.Name,reference.RefGroupId)
                         ).ToList();
...
}


Ошибка:
Выражению LINQ to Entities не удается распознать метод "System.Object SetNameAndGroupID(System.Object, System.String, Int32)", поэтому его нельзя преобразовать в выражение хранилища.

Вот что ему не так? Заранее тип хочет знать? Как ему его скормить по-человечески?)
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37996336
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex.styleДоковырялся до подобного:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        private static dynamic SetNameAndGroupID(object objToExtend, string newName, int GroupID)
        {
            dynamic result = objToExtend;
            result.Name = newName;
            result.GroupID = GroupID;
            return result;
        }

        public void someshit(...params){
...
                var q = (from reference in NSI.Reference
                         join refitems in NSI.RefItems
                             on reference.ReferenceId equals refitems.ReferenceId
                         where (reference.RefGroupId == gpid)
                         select SetNameAndGroupID(refitems,reference.Name,reference.RefGroupId)
                         ).ToList();
...
}


Ошибка:
Выражению LINQ to Entities не удается распознать метод "System.Object SetNameAndGroupID(System.Object, System.String, Int32)", поэтому его нельзя преобразовать в выражение хранилища.

Вот что ему не так? Заранее тип хочет знать? Как ему его скормить по-человечески?)
все правильно, читать что такое IQueryable и что такое IEnumerable и разницу между ними

а данная конструкция заработает тогда, когда запихнешь метод SetNameAndGroupID на sql сервер:)
з.ы предложение выше, просто намек в чем у тебя ошибка
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37996351
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да в базеу тебя эти две таблице связаны ключами ?
Reference RefItems
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37996583
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. На самом деле в базе одна большая таблица Reference, которая является генератором первичных ключей для более мелких таблиц (в плане объема). Она содержит в себе имя. Это типа общего справочника с парой ID-значение.
Другие таблицы ссылаются на нее (PK==FK) (типа RefItems) и содержат информацию, расширяющую Reference.
Там около 70 таблиц. И у них колонок может быть туева хуча.
Я могу делать каждый раз View и использовать его как вариант, но и его придется поддерживать. Хотя трудозатрат меньше, но не намного.
Если бы можно было динамически генерировать класс, заставлять писать в него значения, и заодно предоставить информацию о его типе... но это, наверно, пока из ряда фантастики). Пока остановился на варианте с view.

Если у кого есть еще соображения, поделитесь, пожалуйста!

p.s. все эти танцы с бубном на счет таблиц лишь для того, чтобы в оперативную информацию писать только ключи (int) и ничего более.
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37996606
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу IEnumerable и IQueryable - спасибо за информацию! Посмотрел профилер: IEnumerable мне нагенерил тут всякого))
...
Рейтинг: 0 / 0
Динамический объект в Linq запросе
    #37998315
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex.styleПо поводу IEnumerable и IQueryable - спасибо за информацию! Посмотрел профилер: IEnumerable мне нагенерил тут всякого))

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


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