Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
Как известно, LINQ не поддерживает конструкторы с параметрами. А что, если у меня вся логика в конструкторе основана именно на параметрах и мне нужно их обязательно передать? В LINQ я могу использовать для этого только инициализатор объекта, но логика-то у меня работает именно с параметрами конструктора и именно в конструкторе с параметрами.

Как поступить?
4 окт 13, 11:46    [14922764]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
Заталкивать одну и ту же логику и в конструктор с параметрами, и в конструктор без параметров? - Фигня получается, да и юзер может попытаться использовать конструктор без параметров без инициализатора объекта, что приведёт к сбою работы логики в нём.
4 окт 13, 11:47    [14922774]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
user7320
Как известно, LINQ не поддерживает конструкторы с параметрами.

Что это за бред?

user7320
А что, если у меня вся логика в конструкторе...

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

user7320
В LINQ я могу использовать для этого только инициализатор объекта

Ты что там куришь? Что за инициализатор объекта?
4 окт 13, 11:51    [14922797]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72948
автор
юзер может попытаться использовать конструктор без параметров без инициализатора объекта
Можно скрыть от юзера конструктор без параметров.
4 окт 13, 11:54    [14922823]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72948
Хотя может он и от линка скроется?
4 окт 13, 11:57    [14922846]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
автор
Что за инициализатор объекта?

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. Для этого нужны параметры.
4 окт 13, 12:30    [14923149]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
Antonariy
Хотя может он и от линка скроется?

Ну да.
4 окт 13, 12:30    [14923157]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
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. Для этого нужны параметры.

Расстреливать на месте.
4 окт 13, 12:49    [14923320]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
МСУ
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. Для этого нужны параметры.

Расстреливать на месте.

А как надо?
4 окт 13, 13:11    [14923566]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
user7320
А как надо?

Честно признаться, я даже твою проблему не понял :) Напиши кодом, что у тебя не получается. Может, это трудности изложения...
4 окт 13, 13:15    [14923615]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
МСУ
user7320
А как надо?

Честно признаться, я даже твою проблему не понял :) Напиши кодом, что у тебя не получается. Может, это трудности изложения...

У меня старая тема. Мне надо создать сложный объект, у которого есть поля-коллеции, у которых свои поля-коллекции и т. д. Все поля заполнить нужно из БД, причём выборки надо проводить по определённым параметрам. Вы там все упёрлись в репозиторий. И как тут поможет репозиторий или ещё какая штука, чтобы создать такой объект?

Я не знаю, почему EF не поддерживает конструкторы с параметрами, но если бы поддерживал, то у меня бы не было проблем.
4 окт 13, 13:30    [14923742]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Картинка с другого сайта.
4 окт 13, 13:35    [14923794]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
МСУ
Картинка с другого сайта.

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

+
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. А теперь всё делаю один запросов в инициализаторах. Не то, чтобы я раньше об этом не знал... но как-то подзабыл. И получается, что тот вопрос отпал.

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

И да, я пока не буду репозиторий использовать всё равно. Ведь раньше же как-то жили без репозиториев и ничего - спутники летали, корабли плавали.
4 окт 13, 13:52    [14923950]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
Мне только интересно, во что такой запрос линка выльется в SQL. Наверное, там такая каша будет...
4 окт 13, 13:54    [14923964]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28151
user7320
И да, я пока не буду репозиторий использовать всё равно. Ведь раньше же как-то жили без репозиториев и ничего - спутники летали, корабли плавали.
Репозиторий - это тупо класс, что инкапсулирует в себе логику работы с хранимыми данными. Кто-то когда-то выделил этот класс, так как ему это было надо в практических целях, и использовал такой подход в последующих проектах. Получился шаблон. До появления шаблона каждый делал по своему, и сейчас не запрещается поступать также.

Не хочешь, не используй. Проектируй свои собственные классы.
4 окт 13, 14:32    [14924304]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
А как насчёт предложенного мной запроса выше? Какие могут быть минусы при использовании таких... эмм... каскадов инициализаторов объектов в LINQ-выражениях?
4 окт 13, 15:39    [14924757]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28151
user7320, используется ToList(), то есть будет fetch из WeedGroups, и во время него будет выполняться запрос к Biogroups.
Может вылететь исключение, что нельзя открыть DataReader, т.к. уже есть один открытый.
4 окт 13, 16:09    [14925037]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28151
А про обращение к БД в конктрукторе доменного объекта я промолчу.
4 окт 13, 16:15    [14925077]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
skyANA
А про обращение к БД в конктрукторе доменного объекта я промолчу.

Ну, вы как бы не замечайте этого. Я же сказал, что пока без репозитория.

skyANA
user7320, используется ToList(), то есть будет fetch из WeedGroups, и во время него будет выполняться запрос к Biogroups.
Может вылететь исключение, что нельзя открыть DataReader, т.к. уже есть один открытый.

А что значит "может вылететь"? Я вот запустил пару раз - и всё открылось и выполнилось. При каких условиях может, а при каких не может? Памяти ему не хватит, или количество DataReader'ов ограничего?



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

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

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


// Это делается в репозитории. ЧЕСНА!!!

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();
}
4 окт 13, 17:08    [14925438]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28151
user7320
Это делается в репозитории. ЧЕСНА!!!
Ага, так я и проверил. Использование this.Groups в этом не убеждает.
А в остальном... должно работать...
4 окт 13, 17:32    [14925572]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28151
user7320
UPD. Вы меня уговорили. Вместо IReadOnlyCollection стал использовать IEnumerable. Но не потому, что так типа нужно, а потому, что в линке нельзя использовать параметризованные конструкторы (словил исключение - у ReadOnlyCollection конструктор всего один и обязательно с параметром). И да, убрал ToList в середине запроса. Но не потому, что там типа ДатаРидеров не хватит, а потому, что линк не понимает таких выражений (тоже словил исключение).
Проектирование доменной можеди завязано на "в линке нельзя использовать параметризованные конструкторы", смешно.
4 окт 13, 17:37    [14925611]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
skyANA
user7320
Это делается в репозитории. ЧЕСНА!!!
Ага, так я и проверил. Использование 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 и без) в одном проекте и были ли при этом какие-нибудь проблемы?
4 окт 13, 19:17    [14925888]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
user7320,
все равно, репозитарий не буду делать (с)
4 окт 13, 20:40    [14926096]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
Где-то в степи
user7320,
все равно, репозитарий не буду делать (с)

Вы ещё скажите, что каждое ОРМ у вас в своём репозитории, а не все в одном.
5 окт 13, 06:05    [14927277]     Ответить | Цитировать Сообщить модератору
 Re: Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?  [new]
user7320
Member

Откуда:
Сообщений: 3543
user7320
Где-то в степи
user7320,
все равно, репозитарий не буду делать (с)

Вы ещё скажите, что каждое ОРМ у вас в своём репозитории, а не все в одном.

А каждый репозиторий - отдельный солюшен.

Проблема-то всё равно должна остаться та же, что я описал.
5 окт 13, 06:06    [14927279]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить