powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
25 сообщений из 74, страница 1 из 3
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416561
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как известно, LINQ не поддерживает конструкторы с параметрами. А что, если у меня вся логика в конструкторе основана именно на параметрах и мне нужно их обязательно передать? В LINQ я могу использовать для этого только инициализатор объекта, но логика-то у меня работает именно с параметрами конструктора и именно в конструкторе с параметрами.

Как поступить?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416564
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заталкивать одну и ту же логику и в конструктор с параметрами, и в конструктор без параметров? - Фигня получается, да и юзер может попытаться использовать конструктор без параметров без инициализатора объекта, что приведёт к сбою работы логики в нём.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416568
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Как известно, LINQ не поддерживает конструкторы с параметрами.
Что это за бред?

user7320А что, если у меня вся логика в конструкторе...
За логику в конструкторе нужно скручивать руки и засовывать их догадайся куда.

user7320В LINQ я могу использовать для этого только инициализатор объекта
Ты что там куришь? Что за инициализатор объекта?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416579
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторюзер может попытаться использовать конструктор без параметров без инициализатора объектаМожно скрыть от юзера конструктор без параметров.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416585
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя может он и от линка скроется?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416646
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЧто за инициализатор объекта?
http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx

авторавторКак известно, LINQ не поддерживает конструкторы с параметрами.Что это за бред?
http://stackoverflow.com/questions/3571084/only-parameterless-constructors-and-initializers-are-supported-in-linq-to-entiti

авторЗа логику в конструкторе нужно скручивать руки и засовывать их догадайся куда.
Там логика, которая строит экземляр - свойства там заполняет и всё такое. В частности, в конструкторе выполняется запрос к БД через LINQ to Entities. Для этого нужны параметры.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416650
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyХотя может он и от линка скроется?
Ну да.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416684
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320авторЧто за инициализатор объекта?
http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx
Причем тут LINQ?

user7320 http://stackoverflow.com/questions/3571084/only-parameterless-constructors-and-initializers-are-supported-in-linq-to-entiti
И в чем проблема?

user7320В частности, в конструкторе выполняется запрос к БД через LINQ to Entities. Для этого нужны параметры.
Расстреливать на месте.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416741
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУuser7320пропущено...

http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx
Причем тут LINQ?

user7320 http://stackoverflow.com/questions/3571084/only-parameterless-constructors-and-initializers-are-supported-in-linq-to-entiti
И в чем проблема?

user7320В частности, в конструкторе выполняется запрос к БД через LINQ to Entities. Для этого нужны параметры.
Расстреливать на месте.
А как надо?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416759
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320А как надо?
Честно признаться, я даже твою проблему не понял :) Напиши кодом, что у тебя не получается. Может, это трудности изложения...
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416788
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУuser7320А как надо?
Честно признаться, я даже твою проблему не понял :) Напиши кодом, что у тебя не получается. Может, это трудности изложения...
У меня старая тема . Мне надо создать сложный объект, у которого есть поля-коллеции, у которых свои поля-коллекции и т. д. Все поля заполнить нужно из БД, причём выборки надо проводить по определённым параметрам. Вы там все упёрлись в репозиторий. И как тут поможет репозиторий или ещё какая штука, чтобы создать такой объект?

Я не знаю, почему EF не поддерживает конструкторы с параметрами, но если бы поддерживал, то у меня бы не было проблем.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416802
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416833
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ

Смотри, как я придумал - и не надо в конструкторы передавать контекст или создавать по новому контексту в каждом конструкторе:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public MyModel()
{
  using (MyEntities db = new MyEntities())
  {
    this.Groups = new ReadOnlyCollection<GroupModel>(
      (from wg in db.WeedGroups
       select new GroupModel()
       {
         Id = wg.Id,
         DisplayName = wg.Name,
         Description = wg.Description,
         Biogroups = new ReadOnlyCollection<BiogroupModel>(
           db.Biogroups
           .Where(b => b.WeedGroup.Name == wg.Name)
           .OrderBy(b => b.Name)
           .Select(b => new BiogroupModel()
           {
             Id = b.Id,
             DisplayName = b.Name
           }).ToList())
       }).ToList());
  }
}



Если что, я раньше спрашивал, чтобы в конструктор типа GroupModel передать контекст БД или в нём самом создавать этот контект. Потому что коллецию Biogroups у типа GroupModel заполнял в конструкторе GroupModel. А теперь всё делаю один запросов в инициализаторах. Не то, чтобы я раньше об этом не знал... но как-то подзабыл. И получается, что тот вопрос отпал.

Ну, это же значительно лучше, чем у меня раньше было? Что вы об этом думаете?

И да, я пока не буду репозиторий использовать всё равно. Ведь раньше же как-то жили без репозиториев и ничего - спутники летали, корабли плавали.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416835
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне только интересно, во что такой запрос линка выльется в SQL. Наверное, там такая каша будет...
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416888
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320И да, я пока не буду репозиторий использовать всё равно. Ведь раньше же как-то жили без репозиториев и ничего - спутники летали, корабли плавали.Репозиторий - это тупо класс, что инкапсулирует в себе логику работы с хранимыми данными. Кто-то когда-то выделил этот класс, так как ему это было надо в практических целях, и использовал такой подход в последующих проектах. Получился шаблон. До появления шаблона каждый делал по своему, и сейчас не запрещается поступать также.

Не хочешь, не используй. Проектируй свои собственные классы.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38416987
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как насчёт предложенного мной запроса выше ? Какие могут быть минусы при использовании таких... эмм... каскадов инициализаторов объектов в LINQ-выражениях?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417056
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, используется ToList(), то есть будет fetch из WeedGroups, и во время него будет выполняться запрос к Biogroups.
Может вылететь исключение, что нельзя открыть DataReader, т.к. уже есть один открытый.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417072
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А про обращение к БД в конктрукторе доменного объекта я промолчу.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417210
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА про обращение к БД в конктрукторе доменного объекта я промолчу.
Ну, вы как бы не замечайте этого. Я же сказал, что пока без репозитория.

skyANAuser7320, используется ToList(), то есть будет fetch из WeedGroups, и во время него будет выполняться запрос к Biogroups.
Может вылететь исключение, что нельзя открыть DataReader, т.к. уже есть один открытый.
А что значит "может вылететь"? Я вот запустил пару раз - и всё открылось и выполнилось. При каких условиях может, а при каких не может? Памяти ему не хватит, или количество DataReader'ов ограничего?



Я щас запустил этот код - странно, но почему-то он выдал "Only parameterless constructors and initializers are supported in LINQ to Entities". Это чего, и ReadOnlyCollection тоже нельзя применять, если она с параметров в конструкторе?

UPD. Вы меня уговорили. Вместо IReadOnlyCollection стал использовать IEnumerable. Но не потому, что так типа нужно, а потому, что в линке нельзя использовать параметризованные конструкторы (словил исключение - у ReadOnlyCollection конструктор всего один и обязательно с параметром). И да, убрал ToList в середине запроса. Но не потому, что там типа ДатаРидеров не хватит, а потому, что линк не понимает таких выражений (тоже словил исключение).

В результате получилось вот что. Ну, как теперь?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// Это делается в репозитории. ЧЕСНА!!!

using (CropsProtectionDBLibrary.CropsProtectionEntities db = new CropsProtectionDBLibrary.CropsProtectionEntities())
{
  this.Groups = (from wg in db.WeedGroups
           select new GroupModel()
           {
             Id = wg.Id,
             DisplayName = wg.Name,
             Description = wg.Description,
             Biogroups = db.Biogroups
                   .Where(b => b.WeedGroup.Name == wg.Name)
                   .OrderBy(b => b.Name)
                   .Select(b => new BiogroupModel()
                   {
                     Id = b.Id,
                     DisplayName = b.Name
                   })
           }).ToList();
}
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417247
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Это делается в репозитории. ЧЕСНА!!!Ага, так я и проверил. Использование this.Groups в этом не убеждает.
А в остальном... должно работать...
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417260
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320UPD. Вы меня уговорили. Вместо IReadOnlyCollection стал использовать IEnumerable. Но не потому, что так типа нужно, а потому, что в линке нельзя использовать параметризованные конструкторы (словил исключение - у ReadOnlyCollection конструктор всего один и обязательно с параметром). И да, убрал ToList в середине запроса. Но не потому, что там типа ДатаРидеров не хватит, а потому, что линк не понимает таких выражений (тоже словил исключение).Проектирование доменной можеди завязано на "в линке нельзя использовать параметризованные конструкторы", смешно.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417360
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320Это делается в репозитории. ЧЕСНА!!!Ага, так я и проверил. Использование this.Groups в этом не убеждает.
А в остальном... должно работать...
Я проверил - работает.


А у меня такой вопрос. Кто-нибудь смешивал в одном проекте ORM'ы EF от нескольких БД, при этом сами ORM'ы сгенерены EF разных версий? В частности, у меня в старом проекте надо было добавить функциональности, для этого требовалось подключение к дополнительной БД. Со старой БД соединялся с помощью ORM от EF версии то ли 1.х, то ли 4.0 - вобщем, когда он ещё не умел POCO делать. А с новой БД - с помощью POCO ORM. Ну, и в старом ORM вылетало исключение "Could not find the conceptual model type..." (ситуация типа такой ). В обоих случаях подходы Database First. Вынесение ОРМа новой БД в новый проект того же солюшена не помогло. Переделка старого ОРМа под POCO повлекла ошибки залогинивания, причём как при обращении к старой БД, так и к новой, что на одном сервере, что на другом (на моей машине копия по структуре продакшеновой БД стоит). Насколько я нарыл в Инете, это скорее связано с какими-то настройками то ли СУБД, то ли ОС с её правами доступа. Только штука в том, что если создать новый, пустой проект, и поместить туда два этих ОРМа (к новой и к старой БД), то всё работает и проблем с залогиниванием нет.

Я решил пока это так: вынес ОРМ к новой БД в отдельный солюшен, и подключился из старого солюшена к сборке солюшена с новым ОРМ.

Вобщем, я не прошу во всю эту писанину вникать, просто хочу узнать - кто-нибудь комбинировал ОРМы старых и новых версий EF (особенно с POCO и без) в одном проекте и были ли при этом какие-нибудь проблемы?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417415
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
все равно, репозитарий не буду делать (с)
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417558
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
все равно, репозитарий не буду делать (с)
Вы ещё скажите, что каждое ОРМ у вас в своём репозитории, а не все в одном.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38417559
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Где-то в степиuser7320,
все равно, репозитарий не буду делать (с)
Вы ещё скажите, что каждое ОРМ у вас в своём репозитории, а не все в одном.
А каждый репозиторий - отдельный солюшен.

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


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