powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / IRepository как пользоваться
238 сообщений из 238, показаны все 10 страниц
IRepository как пользоваться
    #38414160
Just User
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помощи.
Начал разбираться с репозитариями... На сайте вроде всё красиво описывают, но в реале у меня не работает.
Подскажите ,что делаю не так.
Имеется база данных на SQLExpress.
1. В проект добавил edmx сформировав его на основе базы данных.
2. Описал абстрактный интерфейс
Код: c#
1.
2.
3.
4.
5.
6.
7.
namespace Model.Abstract
    {
    public interface IГруппыRepository
        {
        IQueryable<Группы> _Группы { get; }
        }
    }


3. Написал реализацию репозитария:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
namespace Model.Concrete
{
    public class ФиктивныйГруппыRepositorty : IКустыRepository
        //Фиктивный жестко закодированный список групп
      
    {
  
        private static IQueryable<Кусты> ФиктивныеГруппы = new List<Группы> {
            new Группы {ID=1, Название="Первая"},
            new Группы {ID=2, Название="Вторая"},
            new Группы {ID=3, Название="Третья"},
            new Группы {ID=4, Название="Четвёртая"}
        }.AsQueryable ();
        public IQueryable<Группы> СписокГрупп;

        public  ФиктивныйГруппыRepositorty ( )
        {
        using (var db = new БазаДанныхEntities ())
            {
            try
                {
                СписокГрупп = db.Кусты;
                }
            catch  { СписокГрупп = ФиктивныеГруппы;
                
                }
            finally { }
            }
            }

        public IQueryable<Группы> _Группы
            {
            get { return СписокГрупп; }
            }
    }
}


в коде контроллера
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public class HomeController : Controller
        {
        private IГруппыRepository РепозитарийГрупп;


        public HomeController ( )
            {
            РепозитарийГрупп = new ФиктивныйГруппыRepositorty();
            }
       
        public ActionResult Index ( )
            {
           
            
            return View (РепозитарийГрупп._Кусты.ToList());
            }


В результате выдаёт ошибку:
авторНевозможно завершить операцию, поскольку класс DbContext был удален.
хотя если в репозитарии пишу что-нибудь так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using (var db = new БазаДанныхEntities ())
            {
            try
                {
                СписокГрупп= from o in db.Группы select o;
                }
            catch  { СписокГрупп = ФиктивныеГруппы;
                
                }
            finally { }
            }
            }


Отлавливает ошибку и возвращает набор данных "ФиктивныеГруппы", а далее без проблем.

Подскажите, что я не понимаю.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414166
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Не надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.
2. Если нужны динамические фильтры, их смело можно описать через Func<> параметр. Параметр перед вызовом честно инициализируется через анонимный делегат.
3. Читай твой "полурусский" код просто невозможно. Пиши нормально и люди тебя начнут понимать.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414177
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ1. Не надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.
2. Если нужны динамические фильтры, их смело можно описать через Func<> параметр. Параметр перед вызовом честно инициализируется через анонимный делегат.
3. Читай твой "полурусский" код просто невозможно. Пиши нормально и люди тебя начнут понимать.

слушай, существует мнение, что IQueryable<T> -- уже готовый интерфейс репы, т.е. его можно невозбранно возвращать. да и как быть с тем же OData? есть весовые причины готовить только IEnumerable/IList?

ну кроме той, чтобы оставить возможность подсовывать в качестве источника данных, провайдер которого даже не собирается поддерживать LINQ?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414217
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414222
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttслушай, существует мнение, что IQueryable<T> -- уже готовый интерфейс репы, т.е. его можно невозбранно возвращать. да и как быть с тем же OData?
OData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием.

hVosttесть весовые причины готовить только IEnumerable/IList
Скиана опередил. У меня тоже этот рецептик пылится. Учи, вникай.
http://codearticles.ru/articles/2357
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414234
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository .

Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел. Спецификации по-любому нужны. Технические поля сущностей ORM скрываются моделью DTO (можно вообще работать с интерфейсами, если уж ORM на столько уродский). UnitOfWork вообще отдельная песня, какого ляда он делает в объекте репозитория? Нафиг его оттуда и проблема решена.

В общем проблем не вижу. Пока что. Или я что-то проглядел? Что может пойти не так при использовании IQueryable<T>? Чистый интерфейс без возможности как-то модифицировать репу.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414252
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

пока что в рецептике усмотрел единственную проблему: Ссылка на Repository из доменного объекта

но отказываться от лейзи пропертей в пользу рисования отдельного DTO над DTO я бы не стал, это не решение проблемы, это геморрой на задницу. спецификации никто не отменял, Include никто не отменял, все это прекрасно ложиться на паттер "Корень агрегации".
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414256
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУOData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием.

как это? у проекта уже есть слой доступа к данным, бизнес-логика. предлагаешь для OData отдельно прокинуть какой-то другой механизм? и в чём профит?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414302
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository .
Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел.
Если не увидел - это твои и только твои проблемы. Пиши код хоть раком, нам-то что с того. Ты попросил озвучить причины, тебе озвучили.

hVosttМСУ, пока что в рецептике усмотрел единственную проблему: Ссылка на Repository из доменного объекта
Речь о IQueryable, сосредоточься. В DTO не нужны никакие ленивые свойства, DTO это объект для трансфера и только.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414309
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУOData - это другая специфика и принцип работы. Не нужно мешать OData с классическим репозиторием.

как это? у проекта уже есть слой доступа к данным, бизнес-логика. предлагаешь для OData отдельно прокинуть какой-то другой механизм? и в чём профит?
В OData IQueryable оперирует контроллер и только он. Контроллер - это не репозиторий. У тебя как всегда смешалось в кучу всё, кони, люди, сено. Еще раз, речь не о OData, в котором есть своя специфика - работа с IQueryable.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414348
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУDTO это объект для трансфера и только.DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе!
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414356
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAhVostt, смотри тут: Проблемы при использовании шаблона Repository .

Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел.Как поарботаешь в команде из 10+ человек, так поймёшь.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414361
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНе надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414362
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУDTO это объект для трансфера и только.DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе!
Не понял, а логика тут каким боком? )
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414367
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУНе надо возвращать IQueryable<T> в репозиториях, только IEnumerable<T> или IList<T>.Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать.
Шаблон Specification, изучаем. Скиана ссылку дал.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414378
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
DTO - это часто архитектурный костыль, возникающий из-за смешивания логики и данных в одном классе!
Не понял, а логика тут каким боком? )
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class C
{
    public int A1 { get; set; }

    public int A2 { get; set; }

    // С сериализацией такого свойства могут возникнуть проблемы.
    // Если логику оставить как есть, вероятно, придётся писать DTO.
    public int A3 { get { return A1 + A2; } }
}

Если работать с WCF, в этом примере тут проблемы точно будут.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414380
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...

Не понял, а логика тут каким боком? )
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class C
{
    public int A1 { get; set; }

    public int A2 { get; set; }

    // С сериализацией такого свойства могут возникнуть проблемы.
    // Если логику оставить как есть, вероятно, придётся писать DTO.
    public int A3 { get { return A1 + A2; } }
}

Если работать с WCF, в этом примере тут проблемы точно будут.

Это не DTO.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414384
Just User
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто нибудь может пояснить в моём коде, что не так и как это можно исправить.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414388
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
Отказ от IQueryable может привести к необходимости реализации через "N+1 запрос", там где этого можно избежать.
Шаблон Specification, изучаем. Скиана ссылку дал.Его возможности ограничены. Есть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
static readonly Expression<Func<C, int>> AddExpr => c => c.A1 + c.A2;

....


var r = 
    from c in db.C
    select new
    {
        c.A1,
        c.A2,
        A3 = AddExpr.Invoke(c.A1, c.A2)
    }
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414392
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class C
{
    public int A1 { get; set; }

    public int A2 { get; set; }

    // С сериализацией такого свойства могут возникнуть проблемы.
    // Если логику оставить как есть, вероятно, придётся писать DTO.
    public int A3 { get { return A1 + A2; } }
}

Если работать с WCF, в этом примере тут проблемы точно будут.

Это не DTO.Да. Это повод создать DTO на пустом месте, о чём я и хотел сказать. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414398
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЕго возможности ограничены.
Чем?

Алексей КЕсть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно.
Речь не о поддержке трансляции выражения, а о типе возвращаемом значении, в данном случае IQueryable.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414400
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЭто повод создать DTO на пустом месте, о чём я и хотел сказать. :-)
Нет никакого пустого места :) DTO нужен только для трансфера. Нужен трансфер (SOA, голуби, РЖД России, etc) - берем DTO, намапливаемся, передаем. Не понимаю проблемы... Причем тут логика-то?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414403
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЕго возможности ограничены.
Чем?Функционалом. :-)

МСУАлексей КЕсть способы лучше. Правда EF "из коробки" такого не умеет, но оно реализуется сравнительно не сложно.
Речь не о поддержке трансляции выражения, а о типе возвращаемом значении, в данном случае IQueryable.IQueryable + подставляемые выражения (назовём это так) позволяют творить чудеса. Зачем же себя ограничивать?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414406
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЭто повод создать DTO на пустом месте, о чём я и хотел сказать. :-)
Нет никакого пустого места :) DTO нужен только для трансфера. Нужен трансфер (SOA, голуби, РЖД России, etc) - берем DTO, намапливаемся, передаем. Не понимаю проблемы... Причем тут логика-то?Проблема в самой необходимости слоя DTO, когда без него можно обойтись.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414407
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КФункционалом. :-)
Каким?
Так... Попахивает топиком ненависти к ASP.NET MVC

Алексей КIQueryable + подставляемые выражения (назовём это так) позволяют творить чудеса. Зачем же себя ограничивать?
Так ты с этим IQueryable + "подставляемые выражения" можешь точно так же работать в шаблоне спецификации. В чем проблема? Накохер (с) мне таскаться с этим IQueryable по всему полю? Сеять потенциальные ошибки, плодить потенциальные грабли и пугать местное население? В топку :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414414
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПроблема в самой необходимости слоя DTO, когда без него можно обойтись.
Не встречал таких ситуаций, даже в самых тривиальных задачах. Добавилось свойство в модель для каких-то своих нужд, зачем мне это поле протаскивать в SOA, нагружая трафик и пугая пользователей веб сервиса? А если у меня 2 веб сервиса, в одном нужно протаскивать это свойство, в другом нельзя. Ну и так далее. Не нужно мешать логику с трансфером, сельчанин :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414417
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУТак... Попахивает топиком ненависти к ASP.NET MVC Это был способ привлечь читателей в топик. Правильное название - залог успеха.

МСУАлексей КIQueryable + подставляемые выражения (назовём это так) позволяют творить чудеса. Зачем же себя ограничивать?
Так ты с этим IQueryable + "подставляемые выражения" можешь точно так же работать в шаблоне спецификации. В чем проблема? Накохер (с) мне таскаться с этим IQueryable по всему полю? Сеять потенциальные ошибки, плодить потенциальные грабли и пугать местное население? В топку :)Накойхер (ц) мне "спецификации", если наружу может торчать честный IQueryable?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414419
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНакойхер (ц) мне "спецификации", если наружу может торчать честный IQueryable?
Это проблема (Repository, как фабрика запросов). Как будешь её решать? Допиливать код в 100500 местах?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414424
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVosttпропущено...


Эту статью уже как-то рассматривали. Проблем в передаче из репозитория IQueryable<T> не увидел.Как поарботаешь в команде из 10+ человек, так поймёшь.

я понял. речь идёт о необъяснимых вещах.

вы так не переживайте, я видел достаточно серьезные проекты, над которыми работают овер 10 человек. так там не то, что не скрывают IQueryable<T>, так вообще фигачат SQL-ники прямо в обработчиках кнопок, фигарят классы для маппинга ОРМ прямо что называется "на месте" и вообще ничуть не запариваются. так что все эти 1000+ команды -- по крайне мере в наших реалиях вот совершенно не аргумент, говнокодят без зазрения совести, только в путь...

давайте хоть одну реальную проблему, к которой может привести выдача репой IQueryable<T>. по вашей же ссылке на каждую проблему есть решение.

где эта нерешаемая трабла, связанная с применением IQueryable<T>? серьезно же спрашиваю, может я чего-то незнаю. и только без вот этих вот "вырастешь — узнаешь"
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414426
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КПроблема в самой необходимости слоя DTO, когда без него можно обойтись.
Не встречал таких ситуаций, даже в самых тривиальных задачах. Добавилось свойство в модель для каких-то своих нужд, зачем мне это поле протаскивать в SOA, нагружая трафик и пугая пользователей веб сервиса?Потому что добавление поля в БД влечёт за собой необходимость изменения формы редактирования. Накой мне добавлять это поле ещё в N классах?

МСУА если у меня 2 веб сервиса, в одном нужно протаскивать это свойство, в другом нельзя. Ну и так далее.Там где это не надо - этого делать не надо. :-)

МСУНе нужно мешать логику с трансфером, сельчанин :)Ну уж как умеем, если что не так - извиняйте. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414427
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУплодить потенциальные грабли и пугать местное население

блин ну выдайте хоть одну потенциальную граблю. че людей мучаете? что за мистика такая???
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414435
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttтак что все эти 1000+ команды -- по крайне мере в наших реалиях вот совершенно не аргумент, говнокодят без зазрения совести, только в путь...
Мы тут паттерны обсуждаем, а не гавнокод. В чём смысл твоего выступления тут?

hVosttдавайте хоть одну реальную проблему, к которой может привести выдача репой IQueryable<T>. по вашей же ссылке на каждую проблему есть решение.
В ссылке всё описано. Если до сих пор не понял эту проблему, то выпей яду.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414436
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУплодить потенциальные грабли и пугать местное население
блин ну выдайте хоть одну потенциальную граблю. че людей мучаете? что за мистика такая???
Ты реально такой тугой? В первой же главе "Проблема: Repository, как фабрика запросов" и 2 варианта решения.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414442
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КНакойхер (ц) мне "спецификации", если наружу может торчать честный IQueryable?
Это проблема (Repository, как фабрика запросов). Как будешь её решать? Допиливать код в 100500 местах?Да нет никаких проблем. Все проблемы в головах авторов паттерна "репозитарий", которые вдруг решили, что можно вынести логику работы с данными отдельно от остальной логики. Это не всегда возможно, поскольку может привести к "N+1". Накой мне проблемы с производительностью?

У меня есть классы сущностей (содержат данные), классы сервисов (содержат логику) и выражения (содержат выражения :-), с целью избежать "N+1" и иметь возможность повторного использования). Сервер приложений, по сути, один большой репозитарий...

А нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414444
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПотому что добавление поля в БД влечёт за собой необходимость изменения формы редактирования. Накой мне добавлять это поле ещё в N классах?
Добавление поля в БД вовсе не означает добавление его в веб сервис.

Алексей КМСУА если у меня 2 веб сервиса, в одном нужно протаскивать это свойство, в другом нельзя. Ну и так далее.Там где это не надо - этого делать не надо. :-)
Это поле (где не надо) всё-равно будет протаскивать в wsdl подписчикам. Их кодогенерированные классы будут содержать лишние свойства. Представляешь ситуацию, если SOA подписчикам нужно только Id и Title, а ты им еще десяток свойств сливаешь? :)

Алексей КНу уж как умеем, если что не так - извиняйте. :-)
Наезд на DTO считаю дерзким и необоснованным! :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414455
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КДа нет никаких проблем. Все проблемы в головах авторов паттерна "репозитарий", которые вдруг решили, что можно вынести логику работы с данными отдельно от остальной логики. Это не всегда возможно, поскольку может привести к "N+1". Накой мне проблемы с производительностью?
Так, еще раз. Какой N + 1, у нас же есть Specification? Ты сказал, что у него возможности ограничены. Но в чем выражено ограничение не признаешься :) Во-вторых, можно Func<> передавать входным параметром, если приспичит.

Алексей КА нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться.
Ты так и не ответил на вопрос про 100500 исправлений в коде...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414460
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КПотому что добавление поля в БД влечёт за собой необходимость изменения формы редактирования. Накой мне добавлять это поле ещё в N классах?
Добавление поля в БД вовсе не означает добавление его в веб сервис.

Алексей Кпропущено...
Там где это не надо - этого делать не надо. :-)
Это поле (где не надо) всё-равно будет протаскивать в wsdl подписчикам. Их кодогенерированные классы будут содержать лишние свойства. Представляешь ситуацию, если SOA подписчикам нужно только Id и Title, а ты им еще десяток свойств сливаешь? :)Я говорю про случаи, когда в сервис надо выложить именно "всё". В веб-проектах, вероятно, такое не требуется. Но у меня WPF, тут такое требуется часто.

МСУАлексей КНу уж как умеем, если что не так - извиняйте. :-)
Наезд на DTO считаю дерзким и необоснованным! :)Зря. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414469
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУhVosttпропущено...

блин ну выдайте хоть одну потенциальную граблю. че людей мучаете? что за мистика такая???
Ты реально такой тугой? В первой же главе "Проблема: Repository, как фабрика запросов" и 2 варианта решения.

делаем набор спецификаций. получаем из репы IQueryable<T> по указанной спецификации. и не надо плодить 100500 методов. зато можно пейджинг повесить без видимых проблем. или отдать в OData. и вообще. какие проблемы-то? ниче не понял. яду выпить не предлагать. скажи лучше что сам не знаешь.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414483
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУТы сказал, что у него возможности ограничены. Но в чем выражено ограничение не признаешься :)Максимум что там можно сделать, это подставить выражение в один из расширяющих методов класса Queryable (Where, Select и т. п.). Мне этого недостаточно.

МСУМСУВо-вторых, можно Func<> передавать входным параметром, если приспичит.И как мы будем подставлять IL, живущий в Func<>, в LINQ Expression?

МСУАлексей КА нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться.
Ты так и не ответил на вопрос про 100500 исправлений в коде... Потому что при использовании подставляемых выражений с повторным использованием всё в порядке.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414485
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414497
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КА нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться.

Проблема: Repository, как фабрика запросовОбъект IQueryable в .NET дает больше возможностей сделать ошибки в проектировании.
Ну дак о чём и речь, что фиг уследишь за тем, что все в команде умеют пользоваться IQueryable и не напишут кода, создающего проблемы.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414500
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой?Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IQueryable<D> D
{
    get
    {
        return 
             from c in db.C
             select new D
             {
                  Base = c,
                  IsActive = c.IsDeleted == false
             };
    }
}
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414502
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttделаем набор спецификаций. получаем из репы IQueryable<T> по указанной спецификации. и не надо плодить 100500 методов. зато можно пейджинг повесить без видимых проблем. или отдать в OData. и вообще. какие проблемы-то? ниче не понял. яду выпить не предлагать. скажи лучше что сам не знаешь.
Какой набор спецификаций, зачем, куда? Какие 100500 методов? Ты о чем?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414504
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КА нытьё по поводу проблем из-за IQueryable - это от неумения им пользоваться.

Проблема: Repository, как фабрика запросовОбъект IQueryable в .NET дает больше возможностей сделать ошибки в проектировании.
Ну дак о чём и речь, что фиг уследишь за тем, что все в команде умеют пользоваться IQueryable и не напишут кода, создающего проблемы.Оно даёт не больше возможностей для ошибки, чем всё остальное. Автор статьи лукавит. Вероятно, он основывается на своём неудачном опыте. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414506
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAhVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой?Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IQueryable<D> D
{
    get
    {
        return 
             from c in db.C
             select new D
             {
                  Base = c,
                  IsActive = c.IsDeleted == false
             };
    }
}

А Вы как обязываете своих разработчиков добавлять такие вот абстракции в проект?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414523
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой?

Меня в параграфе «Проблема: Repository, как фабрика запросов» устраивает:

Решение №2

Можно использовать шаблон Specification вместе c шаблоном Query Object. Второй шаблон уже реализован в .NET с помощью дерева запросов на LINQ.

Только возвращать можно не IEnumerable<T>, а IQueryable<T> — и я не вижу к каким проблемам это может привести. Зато явный профит вижу. Можно сделать Take и Skip, можно сделать OfType, можно сделать выборку только нужных полей (например, если не хочется для отдельных случаев вытаскивать большой блоб) или дополнительно уточнить запрос динамически ( в тех случаях, когда спецификации уже не подходят, например OData, или кастомный фильтр/сортировщик на гриде ).

Я считаю, что IQueryable<T> — разработан совсем не для того, чтобы его похоронили где-то на задворках репозитория. Все, что делается поверх, это очень грубое повторение всё той же работы, которая уже проделана за вас. Какие-то специфичные методы для очень конкретных операций над данными, типо бизнес-логика -- очень хорошо, ведь надо свести к минимуму возможность прикладных разработчиков прострелить себе ногу. Но возможности IQueryable<T> в этом отношении явно переоценены. Я не вижу каких-то явных нерешаемых проблем. Больше вижу религиозно-фанатичный налет в мышлении, раз вместо объяснений летят какие-то непонятные пасы с указанием на бутылку с ядом или "вырастешь узнаешь".
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414525
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...


пропущено...

Ну дак о чём и речь, что фиг уследишь за тем, что все в команде умеют пользоваться IQueryable и не напишут кода, создающего проблемы.Оно даёт не больше возможностей для ошибки, чем всё остальное. Автор статьи лукавит. Вероятно, он основывается на своём неудачном опыте. :-)То есть возможность дублирования логики запросов - это не возможность? Ещё раз: как вы эту НЕВОЗМОЖНОСТЬ обеспечиваете? :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414526
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЯ говорю про случаи, когда в сервис надо выложить именно "всё". В веб-проектах, вероятно, такое не требуется. Но у меня WPF, тут такое требуется часто.
Ну хорошо, выложилось всё. Но причем тут логика (модель, code behind валидация) и презентационный слой (UI, валидация)?

Алексей КМаксимум что там можно сделать, это подставить выражение в один из расширяющих методов класса Queryable (Where, Select и т. п.). Мне этого недостаточно.
Почему же, ты точно так же можешь конструировать весь отложенный запрос или несколько.

Алексей КИ как мы будем подставлять IL, живущий в Func<>, в LINQ Expression?
Какой IL? Я про Func<A, B> predicate, который можно передавать в аргументы.

Алексей КПотому что при использовании подставляемых выражений с повторным использованием всё в порядке.
Какие в результирущем IQueryable "подставляемые выражения"?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414529
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IQueryable<D> D
{
    get
    {
        return 
             from c in db.C
             select new D
             {
                  Base = c,
                  IsActive = c.IsDeleted == false
             };
    }
}

А Вы как обязываете своих разработчиков добавлять такие вот абстракции в проект?Так же как и в остальных случаях. Это могла быть и недостающая вьюха в БД, и всё что угодно, в зависимости от имеющейся архитектуры.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414532
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAhVostt, что тебе в параграфе "Проблема: Repository, как фабрика запросов" не понятно? Не считаешь это проблемой?Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IQueryable<D> D
{
    get
    {
        return 
             from c in db.C
             select new D
             {
                  Base = c,
                  IsActive = c.IsDeleted == false
             };
    }
}



Неправильный ответ. Ты отдаешь IQueryable, чтобы его потом можно было еще дофильтровывать. Так вот о этой дофильтровке и идет речь. В 10 местах ты использовал дофильтровку, потом появился новый признак в БД, который должен учитываться во всех дофильтровках и мы получили в бубен.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414538
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
А Вы как обязываете своих разработчиков добавлять такие вот абстракции в проект?Так же как и в остальных случаях. Это могла быть и недостающая вьюха в БД, и всё что угодно, в зависимости от имеющейся архитектуры.То есть никак не обязываете?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414540
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТолько возвращать можно не IEnumerable<T>, а IQueryable<T> — и я не вижу к каким проблемам это может привести.
Тебе уже 10 раз озвучили эти проблемы. Яд на столе.

hVosttЗато явный профит вижу. Можно сделать Take и Skip, можно сделать OfType, можно сделать выборку только нужных полей (например, если не хочется для отдельных случаев вытаскивать большой блоб) или дополнительно уточнить запрос динамически ( в тех случаях, когда спецификации уже не подходят, например OData, или кастомный фильтр/сортировщик на гриде ).
Это всё делается в реализации метода репозитория. Репозиторий возвращает только то, что нужно потребителю.

hVosttЯ считаю, что IQueryable<T> — разработан совсем не для того, чтобы его похоронили где-то на задворках репозитория.
Никто его хоронить не будет, просто нужно это использовать в правильных местах.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414543
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНеправильный ответ. Ты отдаешь IQueryable, чтобы его потом можно было еще дофильтровывать. Так вот о этой дофильтровке и идет речь. В 10 местах ты использовал дофильтровку, потом появился новый признак в БД, который должен учитываться во всех дофильтровках и мы получили в бубен.

спецификация. упаковываются такие случае в спецификацию. IQueryable<T> не для дофильтрации. а, например, для построения справочника. пейджинга. уточнения типа (в случае inheritance mapping). сортировки. зачем какой-то ещё огород городить? удобный интерфейс. надо пользоваться.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414549
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУТебе уже 10 раз озвучили эти проблемы. Яд на столе.

плохо озвучили. на счет яда понял. отмазка на случаи "я не знаю, или лесом"
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414553
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЯ говорю про случаи, когда в сервис надо выложить именно "всё". В веб-проектах, вероятно, такое не требуется. Но у меня WPF, тут такое требуется часто.
Ну хорошо, выложилось всё. Но причем тут логика (модель, code behind валидация) и презентационный слой (UI, валидация)?Там трёхзвенка. Я хочу увидеть в вебсервисе объект, соответствующий таблице в БД.

МСУАлексей КМаксимум что там можно сделать, это подставить выражение в один из расширяющих методов класса Queryable (Where, Select и т. п.). Мне этого недостаточно.
Почему же, ты точно так же можешь конструировать весь отложенный запрос или несколько.Не точно так же. Гибкости подставляемых выражений там не добиться.

МСУАлексей КИ как мы будем подставлять IL, живущий в Func<>, в LINQ Expression?
Какой IL? Я про Func<A, B> predicate, который можно передавать в аргументы.Func<A, B> vs Expression<Func<A, B>>

Есть разница? :-)

МСУАлексей КПотому что при использовании подставляемых выражений с повторным использованием всё в порядке.
Какие в результирущем IQueryable "подставляемые выражения"? IQueryable не может быть результирующим, результирующим может быть List<T>. IQueryable - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414554
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttIQueryable<T> не для дофильтрации
Ты сам себе противоречишь. Вот тут ты сказал:

hVosttЗато явный профит вижу. Можно сделать Take и Skip

Это таки дофильтрация. Или будешь спорить?

hVosttа, например, для построения справочника. пейджинга. уточнения типа (в случае inheritance mapping). сортировки. зачем какой-то ещё огород городить? удобный интерфейс. надо пользоваться.
Всё это сделает репозиторий, ты только ему передай ему параметры.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414558
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ считаю, что IQueryable<T>...Считай на здоровье. Статья призвана обратить внимание на возможные проблемы их применения.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414564
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТам трёхзвенка. Я хочу увидеть в вебсервисе объект, соответствующий таблице в БД.
То есть у тебя все запросы вида "SELECT * FROM"?


Алексей КНе точно так же. Гибкости подставляемых выражений там не добиться.
В чем выражена эта гибкость? )

Алексей КFunc<A, B> vs Expression<Func<A, B>>
Есть разница? :-)
Не придирайся. Разумеется имелось ввиду Expression + Func, а не голый Func в качестве аргумента :)

Алексей КIQueryable не может быть результирующим, результирующим может быть List<T>. IQueryable - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе.
Не нужен никому фрагмент запроса, потребителю нужен готовый к съедению набор.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414565
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IQueryable<D> D
{
    get
    {
        return 
             from c in db.C
             select new D
             {
                  Base = c,
                  IsActive = c.IsDeleted == false
             };
    }
}



Неправильный ответ. Ты отдаешь IQueryable, чтобы его потом можно было еще дофильтровывать. Так вот о этой дофильтровке и идет речь. В 10 местах ты использовал дофильтровку, потом появился новый признак в БД, который должен учитываться во всех дофильтровках и мы получили в бубен.Я отдаю IQueryable, чтобы на его базе можно было построить множество запросов. Если фильтр, о котором ты говоришь, нужно сделать в одном месте - он будет сделан в одном месте.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414572
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЯ отдаю IQueryable, чтобы на его базе можно было построить множество запросов. Если фильтр, о котором ты говоришь, нужно сделать в одном месте - он будет сделан в одном месте.
Нельзя этого делать, тебе ж объяснили почему. Если потребуется усечь выборку (новое требование) при помощи [Where IsDeleted = False], тебе придется это делать в 100500 местах прикладного кода.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414577
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КТам трёхзвенка. Я хочу увидеть в вебсервисе объект, соответствующий таблице в БД.
То есть у тебя все запросы вида "SELECT * FROM"?
В форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ?

МСУАлексей КНе точно так же. Гибкости подставляемых выражений там не добиться.
В чем выражена эта гибкость? )Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-)

МСУАлексей КFunc<A, B> vs Expression<Func<A, B>>
Есть разница? :-)
Не придирайся. Разумеется имелось ввиду Expression + Func, а не голый Func в качестве аргумента :)У меня телепатор в ремонте.

МСУАлексей КIQueryable не может быть результирующим, результирующим может быть List<T>. IQueryable - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе.
Не нужен никому фрагмент запроса, потребителю нужен готовый к съедению набор.Потребители разные бывают.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414578
Фотография Абсолют
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чем спор? Что возвращать IEnumerable или IQueryable из репозитория? Конечно первое.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414583
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЯ отдаю IQueryable, чтобы на его базе можно было построить множество запросов. Если фильтр, о котором ты говоришь, нужно сделать в одном месте - он будет сделан в одном месте.
Нельзя этого делать, тебе ж объяснили почему. Если потребуется усечь выборку (новое требование) при помощи [Where IsDeleted = False], тебе придется это делать в 100500 местах прикладного кода.Ах вот ты о чём. :-)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
IQueryable<D> D1
{
    get
    {
        return 
             from c in db.C
             select new D
             {
                  Base = c,
                  IsActive = c.IsDeleted == false
             };
    }
}

IQueryable<D> D2
{
    get
    {
        return 
             from d in D
             where d.IsActive
             select d;
    }
}

Обрати внимание, IsActive описано в одном месте.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414585
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
from d in D1

опечатка
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414589
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.
Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто.
А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали.
Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414594
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУА через выражения это выглядит ещё красивее

Код: c#
1.
2.
3.
4.
5.
6.
static readonly Expression<Func<C, bool>> IsActive = c => c.IsDeleted == false;

var r =  
    from c in db.C
    where IsActive.Invoke(c)
    select c;
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414596
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.
Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто.
А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали.
Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает.

это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414598
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414600
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.
Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто.
А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали.
Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает.

это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL ++
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414604
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.

они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414607
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кпропущено...
Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.

они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414609
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.
Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто.
А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали.
Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает.

это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры?

P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.).
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414613
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVosttпропущено...


это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры?

P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.).Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414615
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кпропущено...
Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.

они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Репозиторий, что является и в то же время моделью. Жжёшь.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414620
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВ форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ?
Почему он должен быть "select * from"? А если там еще 10 блоб полей, а если там еще секурность, а если там еще логика - давать поле или не давать. За это отвечает репозиторий, который умеет работать с ISecurityService (через IoC).

Алексей КМСУпропущено...
В чем выражена эта гибкость? )Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-)
Ну давать в трёх словах, мы не торопимся :)

Алексей КАх вот ты о чём. :-)
То есть фильтруем на сервере приложений и фильтруем это же поле и на подписчиках? Изящно :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414625
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttони просто говорят о репозитории, который является и в то же время моделью.
Я плакал...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414628
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры?

P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.).Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится.Бизнес имеет тенденцию расширяться, если он конечно успешный. Сегодня база одна, а завтра...

Наверняка многие, кто пользуется вашими сервисами, имеют при этом свою локальную SQL базу.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414629
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttпропущено...


они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.

Это ещё фигня. Представьте, что есть сущность Resource. А есть с десяток наследников типа ArticleResource, NewsResource, CatalogResource, ProductResource, ProfileResource... И пускай тот веселый тру-архитектор уделается выдавая IEnumerable на каждую сущность. С IQueryable<T> это решается легко. OfType хорошо работает. И не лишает поведения, реализованного для для базового Resource. То же самое со спецификациями, легко наследуются и прикручиваются. В результате кода меньше во много раз, профит тот же.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414636
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУhVosttони просто говорят о репозитории, который является и в то же время моделью.
Я плакал...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414637
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.Вы определение репозитория забыли, или Вы с ним не согласны?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414638
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЯ о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.
Так отдавай сразу весь дата контекст, он тебе и так прокидывает все таблицы и вьюхи как IQueryable.
В GetMyEntityByID есть один большой плюс, кода больше, но весь код структирован и как на ладони. Легкость в сопровождении такого кода, простота и очевидность в рефакторинге, внятное документирование. А то, что у тебя потребители могут выкручивать базу как хотят - приводит только к анархии со всеми вытекающими.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414639
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttпропущено...


они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.Не приведёт.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414640
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.Не приведёт.

вы с МСУ похоже не догоняете о чем говорит Алексей...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414642
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAпропущено...
Не приведёт.

вы с МСУ похоже не догоняете о чем говорит Алексей...Объясни своими словами.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414648
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Just UserПрошу помощи.
Начал разбираться с репозитариями... На сайте вроде всё красиво описывают, но в реале у меня не работает.
Подскажите ,что делаю не так.
Имеется база данных на SQLExpress.
1. В проект добавил edmx сформировав его на основе базы данных.
2. Описал абстрактный интерфейс
3. Написал реализацию репозитария:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
namespace Model.Concrete
{
    public class ФиктивныйГруппыRepositorty : IКустыRepository
    {
        //Фиктивный жестко закодированный список групп
        private static IQueryable<Кусты> ФиктивныеГруппы = new List<Группы>
        {
            new Группы {ID=1, Название="Первая"},
            new Группы {ID=2, Название="Вторая"},
            new Группы {ID=3, Название="Третья"},
            new Группы {ID=4, Название="Четвёртая"}
        }.AsQueryable ();

        public IQueryable<Группы> СписокГрупп;

        public  ФиктивныйГруппыRepositorty()
        {
            using (var db = new БазаДанныхEntities())
            {
                try
                {
                    СписокГрупп = db.Кусты;
                }
                catch
                {
                    СписокГрупп = ФиктивныеГруппы;                
                }
                finally { }
                {
                }
            }
        }

        public IQueryable<Группы> _Группы
        {
            get { return СписокГрупп; }
        }
    }
}



В результате выдаёт ошибку:авторНевозможно завершить операцию, поскольку класс DbContext был удален.
Подскажите, что я не понимаю.
Из-за выделенной в коде контроллера конструкции в момент реального запроса к данным "класс DbContext удален".
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414653
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVosttпропущено...
вы с МСУ похоже не догоняете о чем говорит Алексей...Объясни своими словами.

представьте себе ситуацию, что никакого LINQ вообще нет. что тогда? вы будете делать нечто подобное, чтобы упростить ситуацию. придумаете свой сервис, чтобы генерить SQL код, чтобы не писать его вручную. объявите стандартный интерфейс типа GetById, GetAll... и т.д. короче сделаете свой репозиторий.

при наличии LINQ и необходимых провайдеров этого делать не нужно. по сути дата контекст -- это и есть репозиторий.

но в таком случае, вы решаете, что он позволяет слишком дофига. как выражается МСУ "крутить базу может кто как хочет". но ведь вам не нужно больше заботиться о том, как данные храняться? вы просто показываете класс и говорите "дай мне коллекцию вот таких объектов".

это и есть репозиторий. IQueryable<T> с этой задачей прекрасно справляется.

а теперь всякие IsDeleted, IsActive и прочая хрень, это уже бизнес-логика. для хранилища (базы данных) удаленный объект, -- это его отсутствие. запись с флагом IsDeleted -- это такая же запись, как и все остальные. хранилищу вообще по барабану на все эти флаги, условия, уровни пользовательского доступа приложения.

так вот это уже бизнес-логика. и никоим образом не имеет отношения к репозиторию. а вы эту логику с умным видом навешиваете на репу. репа это как раз то самое, что надо "крутить как хочешь".

в прикладной уровень выдайте сервис, который уже отдает IEnumerable и IList. а репу не трожьте.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414675
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAпропущено...
Объясни своими словами.

представьте себе ситуацию, что никакого LINQ вообще нет. что тогда? вы будете делать нечто подобное, чтобы упростить ситуацию. придумаете свой сервис, чтобы генерить SQL код, чтобы не писать его вручную. объявите стандартный интерфейс типа GetById, GetAll... и т.д. короче сделаете свой репозиторий.

при наличии LINQ и необходимых провайдеров этого делать не нужно. по сути дата контекст -- это и есть репозиторий.

но в таком случае, вы решаете, что он позволяет слишком дофига. как выражается МСУ "крутить базу может кто как хочет". но ведь вам не нужно больше заботиться о том, как данные храняться? вы просто показываете класс и говорите "дай мне коллекцию вот таких объектов".

это и есть репозиторий. IQueryable<T> с этой задачей прекрасно справляется.

а теперь всякие IsDeleted, IsActive и прочая хрень, это уже бизнес-логика. для хранилища (базы данных) удаленный объект, -- это его отсутствие. запись с флагом IsDeleted -- это такая же запись, как и все остальные. хранилищу вообще по барабану на все эти флаги, условия, уровни пользовательского доступа приложения.

так вот это уже бизнес-логика. и никоим образом не имеет отношения к репозиторию. а вы эту логику с умным видом навешиваете на репу. репа это как раз то самое, что надо "крутить как хочешь".

в прикладной уровень выдайте сервис, который уже отдает IEnumerable и IList. а репу не трожьте.И тут Остапа понесло. Чтоб тебя завтра на Java заставили писать.

А если серъёзно, то ты глупости сейчас выдумываешь.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414682
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, были озвучены 3 главные причины, почему IQueryable в репозитории это плохо:
1. Нужно держать живым дата контекст на протяжении более длительного времени. Это плохая практика.
2. "Крутить базу может кто как хочет" (с) Это сеет хаос и демократию прикладного кода, в отличие от строго специфицированных репозиториев.
3. И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли.

Всё это: жесткие архитектурные ограничения. Нравится прибивать на каждый чих себя гвоздями? Я не против. У меня все репозитории (сервисы данных) возвращают коллекции через IEnumerable<T>. А что там спрятано за методом репозитория - никому знать об этом не нужно.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414691
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУУ меня все репозитории ( сервисы данных ) возвращают коллекции через IEnumerable<T>. А что там спрятано за методом репозитория - никому знать об этом не нужно.

3 главные причины, с которыми я полностью согласен.

только осталось одно но.

уточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414709
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttуточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже?
У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414713
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИ тут Остапа понесло. Чтоб тебя завтра на Java заставили писать.

А если серъёзно, то ты глупости сейчас выдумываешь.

нифига. представь себе работу служащего склада. он тебе выдаст что хочешь, и заберет у тебя что хочешь, если площадь позволяет.

однако. просто так он тебе ничего не отдаст. и просто так ничего не примет. только по накладной.

выдача накладных -- задача специального сервиса. работник склада -- репозиторий. напрямую с репозиторием никто не работает, только через сервис.

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

неужели непонятно?

репозиторий -- это абстракция над реальным хранилищем.

к примеру, дата контекст напрямую крутить не имеет смысла, так как -- прямая зависимость от EF / MS SQL. но если дата контекст будет реализовывать внешний интерфейс репозитория, то проблема решена. подсовывай вместо дата контекста что угодно, хоть зампаленные в память коллекции классов. по барабану. лишь бы интерфейс был полностью реализован.

что самое простое в данном случае, это реализовать IQueryable<T>. и парочку Add/Update. управляются транзакции через UnitOfWork, который являясь отдельным интерфейсом, логически существует вообще в стороне.

на счет времени жизни. то здесь уже давно есть решение. управлять жизнью объектов нельзя с помощью примитивного using() -- это детский сад и даже не смешно. создается специальный логический контекст типа LifeScope, которым рулит DI контейнер.

а то высосали проблему из пальца. и теперь решают её дедовскими методами :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414714
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУhVosttуточни пожалуйста, ты говоришь про репозитории или всё таки про сервисы данных ? или это у тебя одно и тоже?
У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно.

это принципиально. читай выше.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414720
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КВ форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ?
Почему он должен быть "select * from"? А если там еще 10 блоб полей, а если там еще секурность, а если там еще логика - давать поле или не давать. За это отвечает репозиторий, который умеет работать с ISecurityService (через IoC).Если бы да кабы... я описал конкретную ситуацию, которая у меня часто встречается. Постановка задачи - форме редактирования нужен объект, соответствующий таблице БД. Накой тут DTO?

МСУАлексей Кпропущено...
Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-)
Ну давать в трёх словах, мы не торопимся :)Я тороплюсь. :-)

МСУАлексей КАх вот ты о чём. :-)
То есть фильтруем на сервере приложений и фильтруем это же поле и на подписчиках? Изящно :)На каких подписчиках? Речь о логике в сервере приложений. На клиента уходит T[]. Я не сторонник LINQ-over-WCF, если ты об этом.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414723
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится.Бизнес имеет тенденцию расширяться, если он конечно успешный. Сегодня база одна, а завтра...

Наверняка многие, кто пользуется вашими сервисами, имеют при этом свою локальную SQL базу.При этом надо понимать, что мы жертвуем производительностью.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414732
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЯ о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти.
Так отдавай сразу весь дата контекст, он тебе и так прокидывает все таблицы и вьюхи как IQueryable.В IQueryable может быть завёрнута прикладная логика.

МСУВ GetMyEntityByID есть один большой плюс, кода больше, но весь код структирован и как на ладони. Легкость в сопровождении такого кода, простота и очевидность в рефакторинге, внятное документирование.Это да. Вдобавок - не каждую логику можно завернуть в IQueryable/Expression. GetByID в определённых случаях единственный выход. Всему своё место.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414744
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУпропущено...

У меня это одно и тоже, я об этом уже писал. Это непринципиально в контексте обсуждаемой темы. Абсолютно.

это принципиально. читай выше.

Это не принципиально. Если тебе нечего сказать по теме и ты хочешь побеседовать на другие темы, то мне просто лень тебе объяснять очевидные вещи. Извини.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414746
Just User
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,
А как правильно?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414762
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAИ тут Остапа понесло. Чтоб тебя завтра на Java заставили писать.

А если серъёзно, то ты глупости сейчас выдумываешь.

нифига. представь себе работу служащего склада. он тебе выдаст что хочешь, и заберет у тебя что хочешь, если площадь позволяет.

однако. просто так он тебе ничего не отдаст. и просто так ничего не примет. только по накладной.

выдача накладных -- задача специального сервиса. работник склада -- репозиторий. напрямую с репозиторием никто не работает, только через сервис.

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

неужели непонятно?

репозиторий -- это абстракция над реальным хранилищем.

к примеру, дата контекст напрямую крутить не имеет смысла, так как -- прямая зависимость от EF / MS SQL. но если дата контекст будет реализовывать внешний интерфейс репозитория, то проблема решена. подсовывай вместо дата контекста что угодно, хоть зампаленные в память коллекции классов. по барабану. лишь бы интерфейс был полностью реализован.

что самое простое в данном случае, это реализовать IQueryable<T>. и парочку Add/Update. управляются транзакции через UnitOfWork, который являясь отдельным интерфейсом, логически существует вообще в стороне.

на счет времени жизни. то здесь уже давно есть решение. управлять жизнью объектов нельзя с помощью примитивного using() -- это детский сад и даже не смешно. создается специальный логический контекст типа LifeScope, которым рулит DI контейнер.

а то высосали проблему из пальца. и теперь решают её дедовскими методами :)Ну и какую умную мысль ты этим хочешь донести?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414768
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Just UserskyANA,
А как правильно?Я не использую IQueryable вне репозитория и не использую EF. Это камрада hVostt лучше спросить

Но. Варианта два:
1. Поднимать DbContext в начале запроса, убивать в конце;
2. Поднимать контекст на время работы конкртеного метода репозитория:Just Userхотя если в репозитарии пишу что-нибудь так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using (var db = new БазаДанныхEntities ())
{
    try
    {
        СписокГрупп= from o in db.Группы select o;
    }
    catch
    {
        СписокГрупп = ФиктивныеГруппы;                
    }
    finally { }
}
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414769
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи.Вы определение репозитория забыли, или Вы с ним не согласны?Тут с этими определениями кто во что горазд.

repository == data access layer

Если доступ к данным будет содержать методы вроде GetXXXByID, при реализации слоя логики N+1 неизбежен.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414773
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA1. Поднимать DbContext в начале запроса, убивать в конце;Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414782
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Вы определение репозитория забыли, или Вы с ним не согласны?Тут с этими определениями кто во что горазд.

repository == data access layerRepositoryA Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Client objects construct query specifications declaratively and submit them to Repository for satisfaction. Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes. Conceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. Repository also supports the objective of achieving a clean separation and one-way dependency between the domain and data mapping layers.
Алексей КЕсли доступ к данным будет содержать методы вроде GetXXXByID, при реализации слоя логики N+1 неизбежен.Если до конца понимать суть шаблона, то откуда какая-то логика N+1?
Если доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована. То есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414790
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЕсли доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована.

System.LINQ.Expression == query specifications

следовательно:

DbContext == Repository

Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-)

Если кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-)

skyANAТо есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения.Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414799
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAЕсли доступ к данным содержит только методы вроде GetXXXByID, то возможноть "Client objects construct query specifications declaratively and submit them to Repository for satisfaction" не реализована.

System.LINQ.Expression == query specifications

следовательно:

DbContext == Repository

Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-)
Вот так просто взял и нарушил концепцию Persistence Ignorance.RepositoryConceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer.
Алексей КЕсли кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-)Кому-то требуется полноценный репозиторий
Алексей КskyANAТо есть репозиторий тупо не предоставляет тот функционал, что должен (мог бы) предоставлять исходя из определения.Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-)Затем, что на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п. Интерфейс к основному хранилищу и конечным точкам был единый, а вот реализации разные. И как-то сложно было применять LINQ2SQL к данным в формате XML даже тогда, когда перешли с .Net 2.0 на .Net 3.5.

Затем что на текущей работе два хранилища: MS SQL Server и MongoDB, - и MS что-то пока не реализовала EF под MongoDB. А кэшируются они в memcached, что является key-value хранилищем, к которому писать IQueryProvider как-то глупо что-ли.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414805
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...


System.LINQ.Expression == query specifications

следовательно:

DbContext == Repository

Все эти определения появились до появления LINQ2SQL. С его выходом всё поменялось. Просто не все ещё это заметили. :-)
Вот так просто взял и нарушил концепцию Persistence Ignorance.RepositoryConceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer.
Вроде тоже правильно:
авторConceptually, a Repository LINQ DbContext encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer.

skyANAАлексей КЕсли кому-то в проекте требуется репозитарий поверх репозитария - я не против. Но мне это не надо. :-)Кому-то требуется полноценный репозиторий
Алексей Кпропущено...
Зачем реализовывать самому функционал, имеющийся в LINQ2SQL? Велосипедостроение тоже должно иметь разумные пределы. :-)Затем, что на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п. Интерфейс к основному хранилищу и конечным точкам был единый, а вот реализации разные. И как-то сложно было применять LINQ2SQL к данным в формате XML даже тогда, когда перешли с .Net 2.0 на .Net 3.5.

Затем что на текущей работе два хранилища: MS SQL Server и MongoDB, - и MS что-то пока не реализовала EF под MongoDB. А кэшируются они в memcached, что является key-value хранилищем, к которому писать IQueryProvider как-то глупо что-ли.Я уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414817
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.И что? Репозиторий должен обеспечивать работу с данными как с in-memory domain object collection, как бы последние не были распределены.
То что Вы при проектировании поддержку этого требования опустили из-за того, что у Вас случай с одной SQL БД, не даёт Вам оснований приравнивать DbContext к репозиторию.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414835
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,автор на прошлой работе данные о забранированном туре были распределены между основным хранилищем системы и конечными точками: поставщиками отелей, перелётов, трансфер, экскурсий и т.п.
Вы что работу поменяли?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38414977
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.И что?И всё. :-)

skyANAРепозиторий должен обеспечивать работу с данными как с in-memory domain object collection, как бы последние не были распределены.В DbContext такой API присутствует.

skyANAТо что Вы при проектировании поддержку этого требования опустили из-за того, что у Вас случай с одной SQL БД, не даёт Вам оснований приравнивать DbContext к репозиторию. Не понял, где я чего опустил.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415042
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANA1. Поднимать DbContext в начале запроса, убивать в конце;Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
Ужос... А у меня нечерезжопное нормальное решение: репозиторий как IDisposable, где в методе Dispose честно прибивается датаконтекст или иной диспосабельный ресурс. Всё в рамках классики без соплей и гадостей.

Алексей КDbContext == Repository
В каком-то приближени, да. Но не совсем, т.к. датаконтекст - это реляционное отображение данных БД (ORM), а репозиторий - посредник между уровнями области определения и распределения данных (domain and data mapping layers), используя интерфейс, схожий с коллекциями для доступа к объектам области определения.

Алексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.
Слушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415292
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиВы что работу поменяли?Уже год и десять месяцев как поменял. Ссылка на текущий проект в профиле.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415300
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУСлушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction?Алексей КВ DbContext такой API присутствует.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415364
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAГде-то в степиВы что работу поменяли?Уже год и десять месяцев как поменял. Ссылка на текущий проект в профиле.
мда.., как быстро летит время (((
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415466
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЯ уже пояснял, что рассматриваю случай с одной SQL БД. Если баз много - там всё очевидно, обсуждать нечего.
Слушай, ну бизнес так неоднороден и расплывчат, как можно закладываться только под БД? Ну а если сейчас БД, а завтра нужно через веб сервис протащить коллекцию из абаперской RFCFunction?А если завтра это будет не нужно? А оно медленно работает уже сегодня.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415468
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зануды...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415579
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КА если завтра это будет не нужно?
Так я же уже писал про непредсказуемость бизнеса и про то, что ты изначально прибиваешь свою архитектуру жирными гвоздями к доске. Не понимаю смысла в этом. Да еще и какую-то жесть с "ThreadStatic + счётчик ссылок" реализовывать.

Алексей КА оно медленно работает уже сегодня.
Ты о чем? Что в репозитории работает медленно? :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415621
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КА оно медленно работает уже сегодня.
Ты о чем? Что в репозитории работает медленно? :)N+1

Мы ходим по кругу. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415642
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...

Ты о чем? Что в репозитории работает медленно? :)N+1

Мы ходим по кругу. :-)То есть у N+1 у вас уже сегодня работает? Или у кого оно работает?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415654
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415684
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КN+1
Мы ходим по кругу. :-)
14913953 :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415694
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть. Иногда лучше решать проблемы по мере их поступления.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415733
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КN+1
Мы ходим по кругу. :-)
14913953 :) 14918949
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415736
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAВообще логика конечно железная: у нас одна БД и завтра ничего не изменится, поэтому и у вас проблем нет и не будет, и не может быть. Иногда лучше решать проблемы по мере их поступления.Спасибо КЭП.

А иногда полезно думать до и во время проектирования системы и смотреть, что вокруг-то происходит и пользоваться своим и чужим опытом, чтобы избежать лишних проблем.

Также полезно внимательно читать, что пишут:Проблемы при использовании шаблона RepositoryКак любой другой шаблон проектирования, Repository имеет множество интерпретаций и реализаций. Вообще, когда речь идет о проектировании, то сложно отделить абсолютно правильное решение от полностью неправильного. Обычно говорят, что всё зависит от ситуации. С другой стороны, в блогах и статьях попадаются решения, в которых авторы нарушают принципы проектирования или предлагают реализации с явными проблемами. Я собрал такие способы использования шаблона Repository, для того чтобы обратить внимание на возможные проблемы их применения.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415746
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...

14913953 :) 14918949 14914378
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415750
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей К 14918949 14914378
14911778
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415760
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА иногда полезно думать до и во время проектирования системы и смотреть, что вокруг-то происходит и пользоваться своим и чужим опытом, чтобы избежать лишних проблем.Главное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-)

Если по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Повторюсь, обсуждать тривиальные вещи, которые нынче модно называть репозитарием, мне не интересно. Там всё очевидно.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415820
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КГлавное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-)
Мнение большинства: биться о бетонную стену головой опасно.
Мнение Васи Кожевникова (сисадмин в головной компании РЖД): всё это хрень, биться головой о бетонную стену можно и нужно - прояснение ума и осознание истинного бытия.

Алексей КЕсли по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность.
Я так и не понял, почему у репозитория с IEnumerable хуже производительность, чем с IQueryable
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415846
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAА иногда полезно думать до и во время проектирования системы и смотреть, что вокруг-то происходит и пользоваться своим и чужим опытом, чтобы избежать лишних проблем.Главное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-)Аргументы в пользу Вашего мнения - это то, что у вас одна SQL БД и завтра это не изменится. При таких условиях сложно сказать, что Ваше мнение неправильное.
Но реальность не ограничивается лишь Вашим случаем.
Алексей КЕсли по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Повторюсь, обсуждать тривиальные вещи, которые нынче модно называть репозитарием, мне не интересно. Там всё очевидно.Ну то есть архитектуру конкретной реализации. И что конкретно Вы хотите обсудить?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415847
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЕсли по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность.
Я так и не понял, почему у репозитория с IEnumerable хуже производительность, чем с IQueryable А я не понял, почему проигнорирован мой ответ , доказывающий несостоятельность автора упомянутого блога.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415851
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примкну к Алексей К

1) Нужно держать живым дата контекст на протяжении более длительного времени. Это плохая практика.

Web, WCF - per call; Winforms, WPF - время жизни окна. Что в этом плохого?

2) "Крутить базу может кто как хочет" (с) Это сеет хаос и демократию прикладного кода, в отличие от строго специфицированных репозиториев.

UI - BL (сервисы) - DAL (репозитории). В сервисах работать с IQueryable, наружу отдавать IEnumerable. Кручу только я сам как хочу. Что в этом плохого?

3) И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли.
Вот этого совсем не понял.
Код: c#
1.
2.
3.
4.
        public IQueryable<T> Query()
        {
            return new List<T>().AsQueryable();
        }
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415855
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Главное - иметь своё мнение. И если оно отличается от мнения большинства, это ещё не значит, что оно неправильное. Ну да Бог с ней, с философией... :-)Аргументы в пользу Вашего мнения - это то, что у вас одна SQL БД и завтра это не изменится. При таких условиях сложно сказать, что Ваше мнение неправильное.
Но реальность не ограничивается лишь Вашим случаем.А я и не утверждаю, что это решение универсальное, и должно применяться повсюду и всеми. В отличие от некоторых любителей репозитариев. :-)

skyANAАлексей КЕсли по теме - хочется обсудить архитектуру, ориентированную на конкретную СУБД + EF + максимальная производительность. Повторюсь, обсуждать тривиальные вещи, которые нынче модно называть репозитарием, мне не интересно. Там всё очевидно.Ну то есть архитектуру конкретной реализации. И что конкретно Вы хотите обсудить?Теперь не знаю. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415858
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983Winforms, WPF - время жизни окна.Я бы тут даже сократил до времени вызова ButtonClick.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415865
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...

Я так и не понял, почему у репозитория с IEnumerable хуже производительность, чем с IQueryable А я не понял, почему проигнорирован мой ответ , доказывающий несостоятельность автора упомянутого блога.А Вы проигнорировали вопрос о том, как это поможет исключить дублирования логики запросов?
Наружу торчит IQueryable. Кто мне запретит обращаться к нему, где хочу и как хочу, а не в одном месте?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415871
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КSerP1983Winforms, WPF - время жизни окна.Я бы тут даже сократил до времени вызова ButtonClick.

Зависит от ситуации. Если взять супер-пупер асинхронный грид у девэкпресса (позволяет при скроле подгружать данные), то для него нужен датаконтекст на все время жизни этого грида, что, скорее всего, равно времени жизни формы.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415875
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Аргументы в пользу Вашего мнения - это то, что у вас одна SQL БД и завтра это не изменится. При таких условиях сложно сказать, что Ваше мнение неправильное.
Но реальность не ограничивается лишь Вашим случаем.А я и не утверждаю, что это решение универсальное, и должно применяться повсюду и всеми. В отличие от некоторых любителей репозитариев. :-)Покажите-ка, где конкретно "любители репозиториев" утверждали, что их решение универсальное.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415877
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP19833) И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли.
Вот этого совсем не понял.
Код: c#
1.
2.
3.
4.
        public IQueryable<T> Query()
        {
            return new List<T>().AsQueryable();
        }

И что демонстрирует Ваш код? Вы предлагаете для начала выбрать все данные в List<T>?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415879
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
А я не понял, почему проигнорирован мой ответ , доказывающий несостоятельность автора упомянутого блога.А Вы проигнорировали вопрос о том, как это поможет исключить дублирования логики запросов?
Наружу торчит IQueryable. Кто мне запретит обращаться к нему, где хочу и как хочу, а не в одном месте? 14913302

Так же ничто не мешает сделать 18 репозитариев с дублирующейся логикой.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415882
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983Алексей Кпропущено...
Я бы тут даже сократил до времени вызова ButtonClick.

Зависит от ситуации. Если взять супер-пупер асинхронный грид у девэкпресса (позволяет при скроле подгружать данные), то для него нужен датаконтекст на все время жизни этого грида, что, скорее всего, равно времени жизни формы.Ок.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415883
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANASerP19833) И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли.
Вот этого совсем не понял.
Код: c#
1.
2.
3.
4.
        public IQueryable<T> Query()
        {
            return new List<T>().AsQueryable();
        }

И что демонстрирует Ваш код? Вы предлагаете для начала выбрать все данные в List<T>?

Нет, я хотел сказать, что IEnumerable легко превращается IQueryable. И поэтому не понимаю, откуда взялась "зависимость от MSSQL + EF", ведь датаконтекст необязателен, а подойдет любой IEnumerable.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415887
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983skyANAпропущено...
И что демонстрирует Ваш код? Вы предлагаете для начала выбрать все данные в List<T>?

Нет, я хотел сказать, что IEnumerable легко превращается IQueryable. И поэтому не понимаю, откуда взялась "зависимость от MSSQL + EF", ведь датаконтекст необязателен, а подойдет любой IEnumerable.

ну или я думаю совсем не туда. Все равно, откуда "зависимость от MSSQL + EF"?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415888
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
А я и не утверждаю, что это решение универсальное, и должно применяться повсюду и всеми. В отличие от некоторых любителей репозитариев. :-)Покажите-ка, где конкретно "любители репозиториев" утверждали, что их решение универсальное. 14911778

Первый же ответ в этом топике. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38415890
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
контекст это не только механизм который гребет данные, но и кеши двух уровней и механизм единицы работы..
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416046
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983skyANAпропущено...
И что демонстрирует Ваш код? Вы предлагаете для начала выбрать все данные в List<T>?

Нет, я хотел сказать, что IEnumerable легко превращается IQueryable. И поэтому не понимаю, откуда взялась "зависимость от MSSQL + EF", ведь датаконтекст необязателен, а подойдет любой IEnumerable.Не "зависимость от MSSQL + EF", а необходимость писать реализацию IQueryProvider там где это не надо: 14913484 .
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416069
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
А Вы проигнорировали вопрос о том, как это поможет исключить дублирования логики запросов?
Наружу торчит IQueryable. Кто мне запретит обращаться к нему, где хочу и как хочу, а не в одном месте? 14913302

Так же ничто не мешает сделать 18 репозитариев с дублирующейся логикой.На практике почему-то такого не происходит

А если торчит IQueryable, значит можно его использовать как IQueryable по полной, разве нет?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416075
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP19833) И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли.
Вот этого совсем не понял.
Код: c#
1.
2.
3.
4.
        public IQueryable<T> Query()
        {
            return new List<T>().AsQueryable();
        }



Ну это жесть какая-то. У одних методов репозтория IQueryable - отложенный запрос, который после транслируется в SQL - это тонкая специфика и понимание, с какой именно БД работаем. Иначе будет ошибка и запрос не сможет транслироваться. У других методов IQueryable не заточен под конкретную БД и представляет собой клиентскую коллекцию. Каша.

Во что ретранслируется этот запрос и что он мне вернет?

Код: c#
1.
var items = Context.Query().Where(d => d.ToString().ToDictionary(x => x, y => y).Any()).ToList();



Бред же.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416145
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
Форум— это дуракаваляние… Разговаривают, разговаривают… Контрреволюция одна. (с)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416313
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
14913302

Так же ничто не мешает сделать 18 репозитариев с дублирующейся логикой.На практике почему-то такого не происходит

А если торчит IQueryable, значит можно его использовать как IQueryable по полной, разве нет?"На практике почему-то такого не происходит" (ц).
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416316
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНу это жесть какая-то. У одних методов репозтория IQueryable - отложенный запрос, который после транслируется в SQL - это тонкая специфика и понимание, с какой именно БД работаем. Иначе будет ошибка и запрос не сможет транслироваться. У других методов IQueryable не заточен под конкретную БД и представляет собой клиентскую коллекцию. Каша."Разруха, она в головах." (ц)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416319
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУБред же.Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416348
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 skyANA и МСУ

Спасибо, понял. Согласен, что IQueryProvider писать не айс; согласен, что для каждого IQueryProvider есть своя специфика и, если отдавать наружу IQueryable, можно словить жопу.

Предлагаю рассмотреть 2 случая:

1) Опять повторюсь, что у devexpress есть возможность работать с гридом асинхронно (подгружать строки при скроле). Для этого надо использовать LinqInstantFeedbackSource,
EntityInstantFeedbackSource, ещечегототамInstantFeedbackSource. При этом код писать практически не надо. Но для InstantFeedbackSource надо указывать Source как IQueryable.

2) Если посмотреть на domainservice (мертвый ria который) или на dataservice (живой OData), то там можно наружу выдавать IQueryable.

Вопрос: мне в этих 2-х случаях отказаться от репозитория и напрямую пользовать контекст или сделать репозиторий с IQueryable?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416368
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К"Разруха, она в головах." (ц)
... которые используют IQueryable методы в репозиториях :)

Алексей КМСУБред же.Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.
Какое еще окружение? Или ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция. Может тебе посмотреть на OData?

SerP19832 skyANA и МСУ

Спасибо, понял. Согласен, что IQueryProvider писать не айс; согласен, что для каждого IQueryProvider есть своя специфика и, если отдавать наружу IQueryable, можно словить жопу.

Предлагаю рассмотреть 2 случая:

1) Опять повторюсь, что у devexpress есть возможность работать с гридом асинхронно (подгружать строки при скроле). Для этого надо использовать LinqInstantFeedbackSource,
EntityInstantFeedbackSource, ещечегототамInstantFeedbackSource. При этом код писать практически не надо. Но для InstantFeedbackSource надо указывать Source как IQueryable.

2) Если посмотреть на domainservice (мертвый ria который) или на dataservice (живой OData), то там можно наружу выдавать IQueryable.

Вопрос: мне в этих 2-х случаях отказаться от репозитория и напрямую пользовать контекст или сделать репозиторий с IQueryable?
1. Вся беда, что ты под какие-то там компоненты пытаешься рихтовать архитектуру. Это не айс.
2. Про OData уже писал, это отдельный специфический продукт, который заточен под IQueryable. Более того, OData - это не репозиторий, там ты сам контроллер ApiController обязываешь играть по правилам IQueryable. Вообщем, это отдельная тема.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416382
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей К"Разруха, она в головах." (ц)
... которые используют IQueryable методы в репозиториях :)У меня вообще нет такого понятия, как репозитарий. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416395
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУБред же.Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.И как им пользоваться? Тот код, что Вы показываете, вызывает вопрос: а зачем тут вообще IQueryable.

И если типа это аналог представления, то сколько у вас таких "представлений"? N + 1?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416402
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP19832 skyANA и МСУ

Спасибо, понял. Согласен, что IQueryProvider писать не айс; согласен, что для каждого IQueryProvider есть своя специфика и, если отдавать наружу IQueryable, можно словить жопу.

Предлагаю рассмотреть 2 случая:

1) Опять повторюсь, что у devexpress есть возможность работать с гридом асинхронно (подгружать строки при скроле). Для этого надо использовать LinqInstantFeedbackSource,
EntityInstantFeedbackSource, ещечегототамInstantFeedbackSource. При этом код писать практически не надо. Но для InstantFeedbackSource надо указывать Source как IQueryable.

2) Если посмотреть на domainservice (мертвый ria который) или на dataservice (живой OData), то там можно наружу выдавать IQueryable.

Вопрос: мне в этих 2-х случаях отказаться от репозитория и напрямую пользовать контекст или сделать репозиторий с IQueryable?Встречный вопрос: Вы OData пользовались?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416411
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУИли ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция.IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416413
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.И как им пользоваться?Если Вы не находите применение такому подходу, наверное, Вам это не надо.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416421
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А до появления WebAPI с поддержкой OData у вас был public API? На чём он был написан? Там использовали IQueryable? Если да, то как парсили параметры HTTP запроса, какой формат предоставляли?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416427
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА до появления WebAPI с поддержкой OData у вас был public API? На чём он был написан? Там использовали IQueryable? Если да, то как парсили параметры HTTP запроса, какой формат предоставляли?Если это вопрос мне, то 14914067 .
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416430
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...
... которые используют IQueryable методы в репозиториях :)У меня вообще нет такого понятия, как репозитарий. :-)
Посмотри на название темы. Что тогда ты тут делаешь? :)

Алексей КМСУИли ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция.IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.
В случае репозитория этот функционал излишен, даже вреден.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416432
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416437
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
У меня вообще нет такого понятия, как репозитарий. :-)
Посмотри на название темы. Что тогда ты тут делаешь? :)Хочешь меня прогнать?

МСУАлексей Кпропущено...
IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.
В случае репозитория этот функционал излишен, даже вреден.В случае IQueryable репозитарий излишен, даже вреден. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416438
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2skyANA
В проектах - нет. Самому потыкаться - да.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416440
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, тролололинг пошёл. А аргументы будут?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416441
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )А 5 25

14914067
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416444
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAТот код, что Вы показываете, вызывает вопрос: а зачем тут вообще IQueryable.Ну могу дать другой пример.
Не для слабонервных
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
738.
739.
740.
741.
742.
743.
744.
745.
746.
747.
748.
749.
750.
using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Runtime.Serialization; 
using System.Security.Permissions; 
using System.ServiceModel; 
using System.Text; 
using CommonDistributed; 
using CommonServer; 
using DbMain; 
using PersonalServer; 
using SspMain; 
  
namespace MessageServer 
{ 
    [DataContract(Namespace = Wsns.Message)] 
    public class MessageTaskView 
    { 
        [DataMember] 
        public int? ID; 
  
        [DataMember] 
        public string ProjectStr; 
  
        [DataMember] 
        public string Subject; 
  
        [DataMember] 
        public string SenderPersStr; 
  
        [DataMember] 
        public string RecipientPersStr; 
  
        [DataMember] 
        public DateTime? CreateDate; 
  
        [DataMember] 
        public DateTime? ActivityDate; 
  
        [DataMember] 
        public DateTime? PlanCompleteDate; 
  
        [DataMember] 
        public string CurrentStateStr; 
  
        [DataMember] 
        public bool IsSenderMe; 
  
        [DataMember] 
        public bool IsRecipientMe; 
  
        [DataMember] 
        public bool CanChangeMessage; 
  
        [DataMember] 
        public bool MustReadMessage; 
  
        [DataMember] 
        public bool IsTaskNotReaded; 
  
        [DataMember] 
        public bool IsCommentNotReaded; 
  
        [DataMember] 
        public bool IsActive; 
  
        [DataMember] 
        public bool IsPlanCompleteDateExpired; 
  
        [DataMember] 
        public bool HasAttachment; 
    } 
  
    [DataContract(Namespace = Wsns.Message)] 
    public class MessageTaskDetail 
    { 
        // Постановка задачи 
  
        [DataMember] 
        public int? ID; 
  
        [DataMember] 
        public string SenderPersStr; 
  
        [DataMember] 
        public bool IsSenderMe; 
  
        [DataMember] 
        public DateTime? CreateDate;         
  
        [DataMember] 
        public DateTime? LastChangeDate; 
  
        [DataMember] 
        public string LastChangePersStr; 
  
        [DataMember] 
        public bool IsLastChangePersMe;         
  
        // Назначение         
  
        [DataMember] 
        public string ProjectStr; 
  
        [DataMember] 
        public string Subject;         
  
        [DataMember] 
        public string RecipientPersStr; 
  
        [DataMember] 
        public bool IsRecipientMe; 
  
        [DataMember] 
        public DateTime? RecipientReadDate; 
  
        // Выполнение 
  
        [DataMember] 
        public DateTime? PlanCompleteDate; 
  
        [DataMember] 
        public bool IsPlanCompleteDateExpired; 
  
        [DataMember] 
        public DateTime? ActivityDate; 
  
        [DataMember] 
        public string CurrentStateStr; 
  
        [DataMember] 
        public DateTime? CurrentStateDate; 
  
        // Задание 
  
        [DataMember] 
        public string ContentText; 
    } 
  
    [DataContract(Namespace = Wsns.Message)] 
    public class MessageTaskEdit 
    { 
        [DataMember] 
        public int? ID; 
  
        [DataMember] 
        public byte[] TaskTimeS; 
  
        [DataMember] 
        public byte[] MessageTimeS; 
  
        [DataMember] 
        public int? ProjectID; 
  
        [DataMember] 
        public int? RecipientPersID; 
  
        [DataMember] 
        public DateTime? PlanCompleteDate; 
  
        [DataMember] 
        public string Subject; 
  
        [DataMember] 
        public string ContentText; 
    } 
  
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    [ServiceContract(Namespace = Wsns.Message)] 
    public class SvcMessageTask 
    { 
        SvcMessageCore SvcMessageCore = new SvcMessageCore(); 
  
        #region MessageTaskView 
  
        IQueryable<MessageTaskView> GetMessageTaskView(IQueryable<message_task> source) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                return
                    from mt in source 
  
                    let m = mt.ID_Reference                     
                    let sender = m.SenderPersID_Reference 
                    let recipient = m.RecipientPersID_Reference 
                    let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
  
                    join currentState in sc.Content.message_taskStates on currentStateID equals currentState.ID 
  
                    select new MessageTaskView 
                    { 
                        ID = mt.ID,                         
                        ProjectStr = mt.ProjectID_Reference.Caption, 
                        Subject = mt.Subject, 
                        SenderPersStr = SvcPersonalCore.GetShortNameTN.Invoke(sender), 
                        RecipientPersStr = SvcPersonalCore.GetShortNameTN.Invoke(recipient), 
                        CreateDate = m.CreateDate, 
                        ActivityDate = SvcMessageTaskCore.GetActivityDate.Invoke(mt), 
                        PlanCompleteDate = mt.PlanCompleteDate, 
                        CurrentStateStr = currentState.Caption, 
                        IsSenderMe = SvcMessageCore.GetIsSenderMe.Invoke(m), 
                        IsRecipientMe = SvcMessageCore.GetIsRecipientMe.Invoke(m) ?? false, 
                        CanChangeMessage = SvcMessageCore.GetCanChangeMessage.Invoke(m), 
                        MustReadMessage = SvcMessageCore.GetMustReadMessage.Invoke(m) ?? false, 
                        IsTaskNotReaded = SvcMessageCore.GetIsNotReadedMessage.Invoke(m) ?? false, 
  
                        IsCommentNotReaded = 
                            ( 
                                from md in mt.message_comments_TaskID_Reference 
                                let mdm = md.ID_Reference 
                                where SvcMessageCore.GetIsNotReadedMessage.Invoke(mdm).Value 
                                select md 
                            ).Any(), 
  
                        IsActive = SvcMessageTaskCore.GetIsActive.Invoke(mt, currentState), 
  
                        IsPlanCompleteDateExpired = 
                            SvcMessageTaskCore.GetIsPlanCompleteDateExpired.Invoke(mt, currentState), 
  
                        HasAttachment = m.message_attachments_MsgID_Reference.Any() 
                    }; 
            } 
        } 
  
        [OperationContract] 
        public MessageTaskView[] GetMessageTaskViewByEfficientFilter 
        ( 
            int direction, // 0 - Все 1 - Входящие 2 - Исходящие 
            int category // 1 - Непрочитанные 2 - Активные 3 - Недавние 
        ) 
        { 
            if (direction < 0 || direction > 2) 
                throw new ArgumentException("direction"); 
  
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = sc.Content.message_task.Take(0); 
  
                if (category == 1) 
                { 
                    #region Непрочитанные 
  
                    if (direction == 0 || direction == 1) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where SvcMessageCore.GetIsNotReadedMessage.Invoke(m).Value 
                            select mt 
                        ); 
  
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsRecipientMe.Invoke(m).Value && 
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where SvcMessageCore.GetIsNotReadedMessage.Invoke(mdm).Value 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0 || direction == 2) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsSenderMe.Invoke(m) && 
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where SvcMessageCore.GetIsNotReadedMessage.Invoke(mdm).Value 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            where
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where SvcMessageCore.GetIsNotReadedMessage.Invoke(mdm).Value 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    #endregion 
                } 
                else if (category == 2) 
                { 
                    #region Активные 
  
                    var protectDateFrom = DbDateTime.Now.AddDays(-365); 
  
                    if (direction == 0 || direction == 1) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
                            join currentState in sc.Content.message_taskStates on currentStateID equals currentState.ID 
                            where
                                SvcMessageCore.GetIsRecipientMe.Invoke(m).Value && 
                                m.CreateDate >= protectDateFrom && 
                                SvcMessageTaskCore.GetIsActive.Invoke(mt, currentState) 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0 || direction == 2) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
                            join currentState in sc.Content.message_taskStates on currentStateID equals currentState.ID 
                            where
                                SvcMessageCore.GetIsSenderMe.Invoke(m) && 
                                m.CreateDate >= protectDateFrom && 
                                SvcMessageTaskCore.GetIsActive.Invoke(mt, currentState) 
                            select mt 
                        ); 
                    } 
  
                    #endregion 
                } 
                else if (category == 3) 
                { 
                    #region Недавние 
  
                    var recentDateFrom = DbDateTime.Now.AddDays(-30); 
  
                    if (direction == 0 || direction == 1) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsRecipientMe.Invoke(m).Value && 
                                m.CreateDate >= recentDateFrom 
                            select mt 
                        ); 
  
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsRecipientMe.Invoke(m).Value && 
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    where md.ID_Reference.CreateDate >= recentDateFrom 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0 || direction == 2) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsSenderMe.Invoke(m) && 
                                m.CreateDate >= recentDateFrom 
                            select mt 
                        ); 
  
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsSenderMe.Invoke(m) && 
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    where md.ID_Reference.CreateDate >= recentDateFrom 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            where
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where
                                        SvcMessageCore.GetIsSenderMe.Invoke(mdm) && 
                                        mdm.CreateDate >= recentDateFrom 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
  
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            where
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where
                                        SvcMessageCore.GetIsRecipientMe.Invoke(mdm).Value && 
                                        mdm.CreateDate >= recentDateFrom 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    #endregion 
                } 
                else
                    throw new ArgumentException("category"); 
  
                return GetMessageTaskView(q.Distinct()).ToArray(); 
            } 
        } 
  
        [OperationContract] 
        public MessageTaskView[] GetMessageTaskViewByFavID(int favID) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mt in sc.Content.message_task 
                    from mtf in mt.message_taskToFavorite_TaskID_Reference 
                    where mtf.FavID == favID 
                    select mt; 
  
                return GetMessageTaskView(q).ToArray(); 
            } 
        } 
  
        [OperationContract] 
        public MessageTaskView GetMessageTaskViewByID(int id) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = sc.Content.message_task.Where(mt => mt.ID == id); 
                return GetMessageTaskView(q).FirstOrDefault(); 
            } 
        } 
  
        [OperationContract] 
        public MessageTaskView[] GetMessageTaskViewByExtendedFilter 
        ( 
            DateTime t1, DateTime t2, int projectID,  
            int? senderPersID, int? recipientPersID, string subject, 
            int[] stateID 
        ) 
        { 
            if
            ( 
                string.IsNullOrWhiteSpace(subject) && 
                senderPersID.HasValue == false && 
                recipientPersID.HasValue == false
            ) 
                return null; 
  
            t1 = t1.Date; 
            t2 = t2.Date.AddDays(1); 
            stateID = stateID ?? new int[0]; 
  
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mt in sc.Content.message_task 
                    let m = mt.ID_Reference 
                    let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
                    where m.CreateDate >= t1 && m.CreateDate < t2 && stateID.Contains(currentStateID.Value) 
                    select new { m, mt }; 
  
                if (senderPersID.HasValue) 
                    q = q.Where(s => s.m.SenderPersID == senderPersID); 
  
                if (recipientPersID.HasValue) 
                    q = q.Where(s => s.m.RecipientPersID == recipientPersID); 
  
                if (string.IsNullOrWhiteSpace(subject) == false) 
                    q = q.Where(s => s.mt.Subject.Contains(subject)); 
  
                if (projectID > 0) 
                    q = q.Where(s => s.mt.ProjectID == projectID); 
  
                return GetMessageTaskView(q.Select(s => s.mt)).ToArray(); 
            } 
        } 
  
        #endregion 
  
        #region MessageTaskDetail 
  
        [OperationContract] 
        public MessageTaskDetail GetMessageTaskDetailByID(int id) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mt in sc.Content.message_task 
                    where mt.ID == id 
  
                    let m = mt.ID_Reference 
                    let sender = m.SenderPersID_Reference 
                    let recipient = m.RecipientPersID_Reference 
                    let lastChangePers = m.LastChangePersID_Reference 
                    let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
  
                    join currentState in sc.Content.message_taskStates on currentStateID equals currentState.ID 
  
                    select new MessageTaskDetail 
                    { 
                        ID = mt.ID, 
                        SenderPersStr = SvcPersonalCore.GetFullNameTN.Invoke(sender), 
                        IsSenderMe = SvcMessageCore.GetIsSenderMe.Invoke(m), 
                        CreateDate = m.CreateDate,                         
                        LastChangeDate = m.LastChangeDate, 
                        LastChangePersStr = SvcPersonalCore.GetFullNameTN.Invoke(lastChangePers), 
                        IsLastChangePersMe = SvcMessageCore.GetIsLastChangePersMe.Invoke(m) ?? false,                         
  
                        ProjectStr = mt.ProjectID_Reference.Caption, 
                        Subject = mt.Subject, 
                        RecipientPersStr = SvcPersonalCore.GetFullNameTN.Invoke(recipient), 
                        IsRecipientMe = SvcMessageCore.GetIsRecipientMe.Invoke(m) ?? false, 
                        RecipientReadDate = m.RecipientReadDate, 
  
                        PlanCompleteDate = mt.PlanCompleteDate, 
                        IsPlanCompleteDateExpired = SvcMessageTaskCore.GetIsPlanCompleteDateExpired.Invoke(mt, currentState), 
                        ActivityDate = SvcMessageTaskCore.GetActivityDate.Invoke(mt), 
                        CurrentStateStr = currentState.Caption, 
                        CurrentStateDate = SvcMessageTaskCore.GetCurrentStateDate.Invoke(mt), 
  
                        ContentText = m.ContentText 
                    }; 
  
                return q.First(); 
            } 
        } 
  
        [OperationContract] 
        public bool GetCanUserChangeTaskStateByID(int taskID) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var task = 
                    ( 
                        from mt in sc.Content.message_task 
                        where mt.ID == taskID 
                        let m = mt.ID_Reference 
                        select new
                        { 
                            SenderPersID = m.SenderPersID, 
                            RecipientPersID = m.RecipientPersID 
                        } 
                    ) 
                    .First(); 
  
                var persID = UserContext.PersID; 
  
                return task.SenderPersID == persID || task.RecipientPersID == persID; 
            } 
        } 
  
        [OperationContract] 
        public ClassifierItem[] GetTaskFavoritesByID(int taskID) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mtf in sc.Content.message_taskToFavorite 
                    let f = mtf.FavID_Reference 
                    where
                        mtf.TaskID == taskID && 
                        f.PersID == UserContext.PersID 
                    orderby f.Caption 
                    select new ClassifierItem 
                    { 
                        ID = f.ID, 
                        Caption = f.Caption 
                    }; 
  
                return q.ToArray(); 
            } 
        } 
  
        #endregion 
  
        #region MessageTaskEdit 
  
        [OperationContract] 
        public MessageTaskEdit GetMessageTaskEditNew() 
        { 
            return new MessageTaskEdit(); 
        } 
  
        [OperationContract] 
        public MessageTaskEdit GetMessageTaskEditByID(int id) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mt in sc.Content.message_task 
                    where mt.ID == id 
                    let m = mt.ID_Reference 
                    select new MessageTaskEdit 
                    { 
                        ID = mt.ID, 
                        TaskTimeS = mt.TimeS, 
                        MessageTimeS = m.TimeS, 
                        ProjectID = mt.ProjectID, 
                        RecipientPersID = m.RecipientPersID, 
                        PlanCompleteDate = mt.PlanCompleteDate, 
                        Subject = mt.Subject, 
                        ContentText = m.ContentText 
                    }; 
  
                return q.First(); 
            } 
        } 
  
        [OperationContract] 
        [PrincipalPermission(SecurityAction.Demand, Role = Roles.message_task)] 
        public int SaveMessageTask(MessageTaskEdit item, UpdateAction action) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                message message; 
                message_task message_task; 
  
                if (action == UpdateAction.Insert) 
                { 
                    message = SvcMessageCore.CreateMessage(); 
                    sc.Content.AttachAsAdded(message); 
                    message.ID = -1; 
  
                    message_task = new message_task(); 
                    sc.Content.AttachAsAdded(message_task); 
                    message_task.ID = message.ID; 
                } 
                else
                { 
                    SvcMessageCore.ValidateCanChangeMessageByID(item.ID.Value); 
  
                    message = sc.Content.message.Where(m => m.ID == item.ID).First(); 
                    message_task = sc.Content.message_task.Where(mt => mt.ID == item.ID).First(); 
  
                    var messageTimeS = sc.Content.Entry(message).Property(v => v.TimeS); 
                    messageTimeS.OriginalValue = item.MessageTimeS; 
                    messageTimeS.CurrentValue = item.MessageTimeS; 
  
                    var taskTimeS = sc.Content.Entry(message_task).Property(v => v.TimeS); 
                    taskTimeS.OriginalValue = item.TaskTimeS; 
                    taskTimeS.CurrentValue = item.TaskTimeS; 
  
                    SvcMessageCore.SetMessageChanged(message); 
                } 
  
                message.RecipientPersID = item.RecipientPersID; 
                message.ContentText = item.ContentText; 
                message_task.ProjectID = item.ProjectID; 
                message_task.PlanCompleteDate = item.PlanCompleteDate; 
                message_task.Subject = item.Subject; 
  
                sc.Content.SaveChanges(); 
                return message.ID.Value; 
            } 
        } 
  
        [OperationContract] 
        [PrincipalPermission(SecurityAction.Demand, Role = Roles.message_task_delete)] 
        public void DeleteMessageTaskByID(int id) 
        { 
            using (var sc = DbMainFactory.Scope) 
            using (new DbContextNoDetectChangesScope(sc.Content)) 
            { 
                SvcMessageCore.ValidateCanChangeMessageByID(id); 
  
                var qDeleteData = 
                    from mt in sc.Content.message_task 
                    where mt.ID == id 
                    select new
                    { 
                        Task = mt, 
                        TaskMessage = mt.ID_Reference, 
                        Comments = 
                            from comment in mt.message_comments_TaskID_Reference 
                            select new
                            { 
                                Comment = comment, 
                                CommentMessage = comment.ID_Reference 
                            }, 
                        Favorites = mt.message_taskToFavorite_TaskID_Reference 
                    }; 
  
                var deleteData = qDeleteData.First(); 
  
                sc.Content.AttachManyAsDeleted(deleteData.Comments.Select(d => d.Comment)); 
                sc.Content.AttachManyAsDeleted(deleteData.Comments.Select(d => d.CommentMessage)); 
                sc.Content.AttachManyAsDeleted(deleteData.Favorites); 
                sc.Content.AttachAsDeleted(deleteData.Task); 
                sc.Content.AttachAsDeleted(deleteData.TaskMessage); 
  
                sc.Content.SaveChanges(); 
            } 
        } 
  
        #endregion 
  
        #region Nsi 
  
        [OperationContract] 
        public ClassifierItem[] GetMessageTaskProjects() 
        { 
            using (var sc = DbMainFactory.Scope) 
                return sc.Content.projects 
                    .Select(p => new ClassifierItem { ID = p.ID, Caption = p.Caption }) 
                    .OrderBy(p => p.Caption) 
                    .ToArray(); 
        } 
  
        [OperationContract] 
        public ClassifierItem[] GetMessageTaskAllStates() 
        { 
            using (var sc = DbMainFactory.Scope) 
                return sc.Content.message_taskStates 
                    .Select(p => new ClassifierItem { ID = p.ID, Caption = p.Caption }) 
                    .OrderBy(p => p.ID) 
                    .ToArray(); 
        } 
  
        #endregion 
    } 
}

...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416446
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КХочешь меня прогнать?
Ну что ты, просто хочу огородить тебя от общества неофитов, которые читают эти злые сообщения про рульность IQueryable :)

Алексей КВ случае IQueryable репозитарий излишен, даже вреден. :-)
Отлично. То есть репозиторий есть зло? Приехали...

Алексей КМСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )А 5 25

14914067
Подожи подожи, мне кажется ты сейчас уходишь от ответа :) Ответь прямо без гавноссылок - какую технологию и какой механизм привязки ты используешь, чтобы пробрасывать IQueryable с сервера приложений? Вопрос понятен, Лёша? )
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416448
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу могу дать другой пример. Не для слабонервных
И где тут IQueryable для клиентов? :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416454
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )

А разве есть что-то стандартное? (bltoolkit не предлагать)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416456
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУТо есть у тебя все запросы вида "SELECT * FROM"?
В форму редактирования уходит объект, сгенерированный по таблице из базы.

Алексей
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        [OperationContract] 
        public ClassifierItem[] GetMessageTaskProjects() 
        { 
            using (var sc = DbMainFactory.Scope) 
                return sc.Content.projects 
                    .Select(p => new ClassifierItem { ID = p.ID, Caption = p.Caption }) 
                    .OrderBy(p => p.Caption) 
                    .ToArray(); 
        } 
  
        [OperationContract] 
        public ClassifierItem[] GetMessageTaskAllStates() 
        { 
            using (var sc = DbMainFactory.Scope) 
                return sc.Content.message_taskStates 
                    .Select(p => new ClassifierItem { ID = p.ID, Caption = p.Caption }) 
                    .OrderBy(p => p.ID) 
                    .ToArray(); 
        } 



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

МСУАлексей КВ случае IQueryable репозитарий излишен, даже вреден. :-)
Отлично. То есть репозиторий есть зло? Приехали...Я бы не был столь категоричен. Ограничусь тем, что в текущих проектах мне он не нужен. :-)

МСУПодожи подожи, мне кажется ты сейчас уходишь от ответа :) Ответь прямо без гавноссылок - какую технологию и какой механизм привязки ты используешь, чтобы пробрасывать IQueryable с сервера приложений? Вопрос понятен, Лёша? )Никакую. :-)

Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416463
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )
А разве есть что-то стандартное? (bltoolkit не предлагать)
Причем тут ORM? Речь о байдингах. Например, вот OData New IQueryable Support for Http Services in WCF

Код: c#
1.
2.
3.
4.
5.
6.
[WebGet(UriTemplate = "")]
[QueryComposition]
public IEnumerable<Contact> Get()
{
    return contacts.AsQueryable();
}



Код: c#
1.
IQueryable<Contact> contacts = client.CreateQuery<Contact>().Where(c => c.Name == "First Contact");



Но у Алексея какое-то своё курево. Либо он нас жестко троллит :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416464
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНикакую. :-)
Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.
Ты ж моё солнце, а как же N+1 в твоём SOA сервисе?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416466
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2МСУ
Я не про orm, я про это Linq over WCF
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416474
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КНикакую. :-)
Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.
Ты ж моё солнце, а как же N+1 в твоём SOA сервисе? Ну вот, опять... Вся логика крутится внутри одного сервера приложений. Про SOA я не говорил.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416475
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей, а как же ThreadStatic + счётчик ссылок? Где оно тут у тебя?

Алексей КЧтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416481
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей, а как же ThreadStatic + счётчик ссылок? Где оно тут у тебя?

Алексей КЧтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
Код: c#
1.
2.
3.
4.
using (var sc = DbMainFactory.Scope) // <== тут
{
    var а = sc.Content.MyTable.ToArray();
}
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416483
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP19832МСУ
Я не про orm, я про это Linq over WCF
Ну я понял, BLT Linq провайдер идет же в комплекте с этой ORM. Ну ладно, не суть.

Алексей КНу вот, опять... Вся логика крутится внутри одного сервера приложений. Про SOA я не говорил.
Ну так в случае веба там тоже репозиторий крутится на сервере приложений. Только лапшекод из бизнес методов вынесен в отдельную абстракцию. Это как гавнокодить логику в обработчике кнопки :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416488
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КНу вот, опять... Вся логика крутится внутри одного сервера приложений. Про SOA я не говорил.
Ну так в случае веба там тоже репозиторий крутится на сервере приложений. Только лапшекод из бизнес методов вынесен в отдельную абстракцию. Это как гавнокодить логику в обработчике кнопки :)Ну у меня WPF. Логика естественным образом отделяется от "морды" WCF-ом. :-)

А в аспнете да, там есть соблазн запихать всё в контроллер. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416511
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...

Ну так в случае веба там тоже репозиторий крутится на сервере приложений. Только лапшекод из бизнес методов вынесен в отдельную абстракцию. Это как гавнокодить логику в обработчике кнопки :)Ну у меня WPF. Логика естественным образом отделяется от "морды" WCF-ом. :-)Это я к тому, что в следствие имеющейся архитектуры, мне дополнительные абстракции в виде слоя репозитариев на сервере приложений не нужны. Если я правильно тебя понял, у меня сетевая служба сервера приложения является репозитарием.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416536
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу у меня WPF. Логика естественным образом отделяется от "морды" WCF-ом. :-)
А в аспнете да, там есть соблазн запихать всё в контроллер. :-)
Милок, а чем идеологически твой толстый ServiceContract отличается от контроллера в ASP.NET? :) Лично считаю утолщать эти классы - зло. Нужна дополнительная абстракция и называется она - репозиторий. Отдельная сборка, твой ServiceContract ничего не должен знать о БД.

Алексей КЭто я к тому, что в следствие имеющейся архитектуры, мне дополнительные абстракции в виде слоя репозитариев на сервере приложений не нужны. Если я правильно тебя понял, у меня сетевая служба сервера приложения является репозитарием.
Нужны, Леша, нужны. Не спорь, а верь мне на слово. Не зря я писал про ограждение неофитов от тебя :)

...


Не учи детей плохому!
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416567
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЭто я к тому, что в следствие имеющейся архитектуры, мне дополнительные абстракции в виде слоя репозитариев на сервере приложений не нужны. Если я правильно тебя понял, у меня сетевая служба сервера приложения является репозитарием.
Нужны, Леша, нужны. Не спорь, а верь мне на слово. Не зря я писал про ограждение неофитов от тебя :)Бытует мнение, что недостаточная ответственность у класса не меньшее зло, чем наличие лишней ответственности.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
[ServiceContract]
public class MyWcfService
{
    [OperationContract]
    public void MyOperation()
    {
        // Накой мне слой методов, содержащих только делегирование?
        MyRepository.MyOperationCore();
    }
}
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416578
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУМилок, а чем идеологически твой толстый ServiceContract отличается от контроллера в ASP.NET? :)Тем, что в аспнет метод контроллера может содержать код, отвечающий за управление не только данными, но и View.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416584
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНакой мне слой методов, содержащих только делегирование?
Зачем же только делегирование? В контроллере ты можешь маппить dto и модели, писать условия в разрезе секурности, что-то анализировать и т.д. А потом вызывать честный репозиторий, передавать подготовленные аргументы, принимать результат, маппить его на dto, формировать текст и код ошибки, если она есть, и возвращать требуемый объект. Как видишь, контроллер (метод сервис контракта) это не тупо делегирование.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416589
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУМилок, а чем идеологически твой толстый ServiceContract отличается от контроллера в ASP.NET? :)Тем, что в аспнет метод контроллера может содержать код, отвечающий за управление не только данными, но и View.
Ты заблуждаешься. В асп.нет контроллер ничего не знает о View, отдает только модель для представления. И тут тоже самое, по сути. Твой метод подготавливает ответ с конкретным DTO. На лицо аналогия.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416598
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КНакой мне слой методов, содержащих только делегирование?
Зачем же только делегирование? В контроллере ты можешь маппить dto и модели, писать условия в разрезе секурности, что-то анализировать и т.д. А потом вызывать честный репозиторий, передавать подготовленные аргументы, принимать результат, маппить его на dto, формировать текст и код ошибки, если она есть, и возвращать требуемый объект. Как видишь, контроллер (метод сервис контракта) это не тупо делегирование.Ну всё правильно, в аспнет - да. Но в WCF? Я привёл выше реальный пример. Там будет только делегирование + атрибуты для безопасности. Обработка ошибок у меня централизованная, вынесена в ServiceBehavior.

Мне контракт сервисов в интерфейсы лень выносить, а ты говоришь ещё добавить слой репозитариев...

Зачем мне такое счастье?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416604
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
Тем, что в аспнет метод контроллера может содержать код, отвечающий за управление не только данными, но и View.
Ты заблуждаешься. В асп.нет контроллер ничего не знает о View, отдает только модель для представления.Ну он там может знать, а может и не знать. Например, в зависимости от каких-то условий вернуть разные вью. Но не буду спорить, я в аспнете пока не силён. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416612
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУМы сейчас говорим об внутреннем устройстве информационной системы. Оно должно максимально удобно поддерживаться и модифицироваться. Тут лишние слои только мешают. Это не интеграция со смежной системой, которая должна гарантировать определённый контракт.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416622
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу всё правильно, в аспнет - да. Но в WCF?
Да какая разница? :) Что метод контроллера, что метод webapi контроллера, что метод odata контроллера, что operation contract метод, что метод веб сервиса. Никакой принципиальной разницы. Все эти методы должны честно общаться с middle слоем, который и представляет собой репозиторий. Вот о чем тут спич трется.

Алексей КЯ привёл выше реальный пример. Там будет только делегирование + атрибуты для безопасности. Обработка ошибок у меня централизованная, вынесена в ServiceBehavior.
Ну для каких-то элементарных методов может и будет делегирование, но это как правило редкость. Во многих случаях те же ошибки, информацию о прохождении валидации и т.п. пакуют в ответ. И это более правильный подход на мой взгляд, чем жить в рутине try/catch.

Алексей КЗачем мне такое счастье?
Ты про свой лапшекод в "обработчиках", который прибит к конкретной БД? :)

http://msdn.microsoft.com/ru-ru/library/gg416511(v=vs.98).aspx Добавление репозитория
При работе с платформой MVC не рекомендуется включать модель сущность-данные (EDM) или код какой-либо другой платформы доступа к данным в контроллер. Вместо этого нужно использовать шаблон репозитория. Репозиторий располагается между приложением и хранилищем данных. Репозиторий разделяет бизнес-логику и взаимодействие с исходной базой данных и объединяет все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных.
Репозиторий возвращает объекты из модели домена. В простых моделях, таких как та, которая используется в этом пошаговом руководстве, объекты, возвращаемые из EDM, LINQ to SQL и других моделей данных, квалифицируются как объекты домена.
В более сложных приложениях может потребоваться слой сопоставления. Слой сопоставления не всегда оказывается неэффективным. Поставщики LINQ могут создавать эффективные запросы серверному хранилищу данных (то есть они могут отправлять запросы с использованием минимального числа промежуточных объектов).
Для того чтобы использовать репозиторий, не требуются глубокие знания EDM, LINQ to SQL или каких-либо других моделей данных, с которыми работает пользователь. (Хотя LINQ не описывается в данном пошаговом руководстве, использование LINQ в качестве абстракции запросов означает, что механизм хранения данных можно скрыть. Благодаря этому можно, например, использовать SQL Server для производства, а LINQ to Objects в коллекциях в оперативной памяти — для тестирования.)
Чтобы протестировать методы действий в контроллере, осуществляющие прямой доступ к модели EDM, необходимо подключение к базе данных, поскольку методы действий зависят от EDM (которая, в свою очередь, зависит от базы данных). В следующем примере кода показан контроллер MVC, использующий сущность "Контакт" модели EDM напрямую. Кроме того, из этого примера становится понятно, почему смешение вызовов базы данных в методах действий усложняет тестирование метода действия. Например, модульные тесты, изменяющие и удаляющие данные, изменяют состояние базы данных. Поэтому для каждого прохождения модульного теста требуется чистая база данных. Кроме того, вызовы базы данных расходуют большое количество ресурсов, а модульные тесты — незначительное количество ресурсов, поэтому их можно часто выполнять в ходе разработки приложения.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416624
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУТы заблуждаешься. В асп.нет контроллер ничего не знает о View, отдает только модель для представления.Ну он там может знать, а может и не знать. Например, в зависимости от каких-то условий вернуть разные вью. Но не буду спорить, я в аспнете пока не силён. :-)
Он не может знать о представлении. Без ну и но :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416625
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кв зависимости от каких-то условий вернуть разные вью.
Вернуть вью - это не знать он них :) Он может вернуть "название вью", а доступ к представлению запрещен по сути даже самого паттерна MVC.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416629
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВо многих случаях те же ошибки, информацию о прохождении валидации и т.п. пакуют в ответ. И это более правильный подход на мой взгляд, чем жить в рутине try/catch.Повторюсь, в WCF есть возможность централизовать обработку ошибок, написав соответствующий ServiceBehavior. В аспнете есть аналогичные возможности. Я же дал реальный пример, там нет ни одного try/catch.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416630
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кв зависимости от каких-то условий вернуть разные вью.
Вернуть вью - это не знать он них :) Он может вернуть "название вью".Ну вот, это и есть логика управления представлением, о чём я и говорю. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416633
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУинформацию о прохождении валидации и т.п.При ошибках соапной валидации до вызова метода дело не дойдёт. А прикладная валидация - это часть прикладной логики, которая должна располагаться в репозитарии, если следовать декларируемым тобою принципам. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416638
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ http://msdn.microsoft.com/ru-ru/library/gg416511(v=vs.98).aspx советы гореархитерторов поскипаныВот только не надо мне цитировать архитектурные советы гореархитекторов из Microsoft. Они в последнее время такого нагородили, что доверия к ним в ближайшие года не будет.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416643
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУВо многих случаях те же ошибки, информацию о прохождении валидации и т.п. пакуют в ответ. И это более правильный подход на мой взгляд, чем жить в рутине try/catch.Повторюсь, в WCF есть возможность централизовать обработку ошибок, написав соответствующий ServiceBehavior. В аспнете есть аналогичные возможности. Я же дал реальный пример, там нет ни одного try/catch.
Да не суть, есть возможность в wcf - и шут с ней. Я говорю о том, что нужно разделять бизнес-логику и взаимодействие с БД (или любым источником) + объединять все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных . Вот основной момент. А как ты там обработаешь ошибку, второй момент.

Алексей КНу вот, это и есть логика управления представлением, о чём я и говорю. :-)
Это не "управление представлением" :)

Алексей КМСУпропущено...
Вот только не надо мне цитировать архитектурные советы гореархитекторов из Microsoft. Они в последнее время такого нагородили, что доверия к ним в ближайшие года не будет.
Жжешь.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416657
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вынес в отдельный рецепт: Рекомендация MS об использовании репозитория в MVC
Оргаждаю неофитов... ))
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416665
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЯ говорю о том, что нужно разделять бизнес-логику и взаимодействие с БД (или любым источником) + объединять все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных . Вот основной момент. А как ты там обработаешь ошибку, второй момент.Основной момент в том, что тут описано максимальное количество слоёв, которые можно реализовать в данной архитектуре. А вот нужны ли они мне все в моём конкретном случае - это уже моё личное дело, и если я какие-то слои посчитаю ненужными в данном проекте - никто не в праве осуждать меня за это. У меня одна из целей - сократить размер программы. Как ни крути, это один из наиболее эффективных способов сократить время разработки.

МСУАлексей КНу вот, это и есть логика управления представлением, о чём я и говорю. :-)
Это не "управление представлением" :)Называй это как хочешь. :-)

МСУАлексей Кпропущено...
Вот только не надо мне цитировать архитектурные советы гореархитекторов из Microsoft. Они в последнее время такого нагородили, что доверия к ним в ближайшие года не будет.
Жжешь.Скорее плачу... Планета деградирует...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416678
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КОсновной момент в том, что тут описано максимальное количество слоёв, которые можно реализовать в данной архитектуре.
Не максимальный, а минимальный. Можно добавить для более сложных случаев слой сопоставления . Описано в том же мануале от MS, который ты по непонятным причинам забраковал.

Алексей КА вот нужны ли они мне все в моём конкретном случае - это уже моё личное дело, и если я какие-то слои посчитаю ненужными в данном проекте - никто не в праве осуждать меня за это. У меня одна из целей - сократить размер программы. Как ни крути, это один из наиболее эффективных способов сократить время разработки.
Ну хочешь "гавнокодить в обработчиках" - твоё право. Но тема у нас - репозиторий, не забыл? :)
Напоминаю, я некоторые еще товарищи объяснили автору, что IQueryable в репозитории - это зло. И объяснили почему. Ты встрял и начал ругаться на нас. В чем смысл твоих высказываний тогда, если тебе репозитории не нуждны? :)

Алексей КСкорее плачу... Планета деградирует...
Пойду попью кофейку, буду много думать об этом.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416697
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНу хочешь "гавнокодить в обработчиках" - твоё право."Гавнокодить" можно в любом месте. Наличие дополнительного слоя автоматически не избавляет от "говнокода". Более того, "гавнокод" в нескольких слоях гораздо хуже "гавнокода" в одном слое.
МСУНо тема у нас - репозиторий, не забыл? :)Всё правильно. Мы говорим об их нужности в различных условиях. :-)
МСУАлексей КСкорее плачу... Планета деградирует...
Пойду попью кофейку, буду много думать об этом.Приятного аппетита. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416708
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К"Гавнокодить" можно в любом месте. Наличие дополнительного слоя автоматически не избавляет от "говнокода".
Так никто не заставляет от него избавляться, если тебе он так дорог. Речь идет о:
МСУЯ говорю о том, что нужно разделять бизнес-логику и взаимодействие с БД (или любым источником) + объединять все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных.

Алексей КБолее того, "гавнокод" в нескольких слоях гораздо хуже "гавнокода" в одном слое.
Смотря с какой стороны посмотреть :)

Алексей КВсё правильно. Мы говорим об их нужности в различных условиях. :-)
Не ссать людям в глаза врать! Речь была о IQueryable в контроллере, за который ты так рьяно выступал
Не стыдно? :)

Алексей КПриятного аппетита. :-)
Спасибо :)

P.S. Какой итог? )
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416715
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КНу могу дать другой пример. Не для слабонервных
И где тут IQueryable для клиентов? :)+1
Пример к теме проблем репозитория вообще не относится.
Репозитоий я могу использовать повторно в рамках одного проекта. В разных проектах.
А метод GetMessageTaskView как мне использовать, кроме как в сервисе? Копипастить содержимое?

Или сейчас начнётся: ну у меня одна база, один сервис, больше этот функционал нигде не нужен.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416722
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЯ говорю о том, что нужно разделять бизнес-логику и взаимодействие с БД (или любым источником) + объединять все операции доступа к данным в одной области, что значительно упрощает создание и обслуживание данных.А зачем там что-то отделять. EF прекрасно всё отделяет и даёт возможность работать с данными средствами, встроенными в сам язык (C#). Что ещё может быть надо?
МСУP.S. Какой итог? )Очевидно, я молодец!
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416723
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAРепозитоий я могу использовать повторно в рамках одного проекта. В разных проектах.
А метод GetMessageTaskView как мне использовать, кроме как в сервисе? Копипастить содержимое?Сделать его public и получить к нему доступ из других классов?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416726
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416733
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, ладно, Лёшу одного товарища попинали за IQueryable в репозитории. Оказалось, что у него репозиториев вообще нет и он имел ввиду (о боже!) про нужность репозитория как класс :) Таким образом, все поняли, что у Алексея нет никаких IQueryable реп и хорошо.

Но остаётся у нас на повестке дня вопрос с hVostt

hVosttя понял. речь идёт о необъяснимых вещах.
вы так не переживайте, я видел достаточно серьезные проекты
давайте хоть одну реальную проблему, к которой может привести выдача репой IQueryable<T>. по вашей же ссылке на каждую проблему есть решение.

hVosttМСУhVostt, были озвучены 3 главные причины, почему IQueryable в репозитории это плохо:

1. Нужно держать живым дата контекст на протяжении более длительного времени. Это плохая практика.
2. "Крутить базу может кто как хочет" (с) Это сеет хаос и демократию прикладного кода, в отличие от строго специфицированных репозиториев.
3. И самая главная причина: зависимость от MSSQL + EF. Изменится источник или хранилище данных - приплыли.

Всё это: жесткие архитектурные ограничения. Нравится прибивать на каждый чих себя гвоздями? Я не против. У меня все репозитории (сервисы данных) возвращают коллекции через IEnumerable<T>. А что там спрятано за методом репозитория - никому знать об этом не нужно.
3 главные причины, с которыми я полностью согласен.

Так я не понял, наш очень опытный и замечательный hVostt использует IQueryable репозитории или он просто вышел опять посмердить на форуме?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416740
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КА зачем там что-то отделять. EF прекрасно всё отделяет и даёт возможность работать с данными средствами, встроенными в сам язык (C#). Что ещё может быть надо?
Ну если тебе ничего не надо отделять, нах тебе нужен WCF как третий уровень, пиши двузвенку и дергай БД прямо из своих впф клиентов. Ась?

Алексей КМСУP.S. Какой итог? )Очевидно, я молодец!
С этим никто не спорит :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416746
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAРепозитоий я могу использовать повторно в рамках одного проекта. В разных проектах.
А метод GetMessageTaskView как мне использовать, кроме как в сервисе? Копипастить содержимое?Сделать его public и получить к нему доступ из других классов?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416749
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КА зачем там что-то отделять. EF прекрасно всё отделяет и даёт возможность работать с данными средствами, встроенными в сам язык (C#). Что ещё может быть надо?
Ну если тебе ничего не надо отделять, нах тебе нужен WCF как третий уровень, пиши двузвенку и дергай БД прямо из своих впф клиентов. Ась?На Делфи ещё предложи, ага...

МСУАлексей Кпропущено...
Очевидно, я молодец!
С этим никто не спорит :)Это главное.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416752
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.
Расскажи нам про базовые принципы рефакторинга?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416758
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.
Расскажи нам про базовые принципы рефакторинга? А про ООП почему не надо?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416761
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КА про ООП почему не надо?
:)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416770
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAРепозитоий я могу использовать повторно в рамках одного проекта. В разных проектах.
А метод GetMessageTaskView как мне использовать, кроме как в сервисе? Копипастить содержимое?Сделать его public и получить к нему доступ из других классов?Дак он итак паблик
То есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса?
Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте.

А если мне к примеру в голову придёт такая идея: подключить морду WPF напрямую к БД? Ну к примеру к локальной тестовой базе?
Опять тянуть сборку WCF сервиса?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416774
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.Хм. Ну вот они: SOLID . Разберём Ваш код?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416782
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAОпять тянуть сборку WCF сервиса?
Алексей очень много и красиво писал на форуме про слабосвязность кода (IoC и DI), но как мы видим по его wcf сервису всё не так эпично, как давече представлялось
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416785
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУskyANA, ладно, Лёшу одного товарища попинали за IQueryable в репозитории.Дак у него нет репозитория, он ему и не нужен. Я вообще не понимаю о чём он рассуждает. О том что с IQueryable нет проблем, если база одна, раотает с ней только один сервис и повторное использование кода на фиг не нужно.
Ну дак то, что в частном конкретном случае с IQueryable нет проблем, ни о чём не говорит, кроме как о том, что в частном конкретном случае с IQueryable нет проблем.

Мне интересно, что это за продукт и под какой нагрузкой работает сервис?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416787
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Сделать его public и получить к нему доступ из других классов?Дак он итак паблик Таки нет. :-)
skyANAТо есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса?
Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте.
Ну сделать для него обёртку?
Код: c#
1.
2.
3.
public IQueryable<C> P1 { get { ... } }

public C[] P2 { get { return P1.ToArray(); } }


skyANAА если мне к примеру в голову придёт такая идея: подключить морду WPF напрямую к БД? Ну к примеру к локальной тестовой базе?
Опять тянуть сборку WCF сервиса?Задачу надо ставить жосче: "А если WPF-морда захочет читать данные напрямую из файлов, в которых хранит MSSQL свои базы". :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416791
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.Хм. Ну вот они: SOLID . Разберём Ваш код? Я убегаю. Может завтра...

Всем приятных выходных!
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416793
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУskyANAОпять тянуть сборку WCF сервиса?
Алексей очень много и красиво писал на форуме про слабосвязность кода (IoC и DI), но как мы видим по его wcf сервису всё не так эпично, как давече представлялось Я всегда был противником повсеместного IoC и DI. У меня до сих пор смешанные чувства по этому поводу. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416794
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, да хрен его знает, что там реально за архитектура. В "IQueryable-слое" по большому счету смысла особого не вижу, т.к. его дата контекст и так таблицы и вьюхи в IQueryable возвращает. Разве что писать линейную генерик-обертку над дата контекстом? Вот это точно бред. Короче, всё туманно...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416805
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Дак он итак паблик Таки нет. :-)Точно! Класс паблик, а метод нет. :)
Алексей КskyANAТо есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса?
Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте.
Ну сделать для него обёртку?
Код: c#
1.
2.
3.
public IQueryable<C> P1 { get { ... } }

public C[] P2 { get { return P1.ToArray(); } }

Какую ещё обёртку? Над чем? Куда обёртка собирается, как её использовать?
Алексей КskyANAА если мне к примеру в голову придёт такая идея: подключить морду WPF напрямую к БД? Ну к примеру к локальной тестовой базе?
Опять тянуть сборку WCF сервиса?Задачу надо ставить жосче: "А если WPF-морда захочет читать данные напрямую из файлов, в которых хранит MSSQL свои базы". :-)А ну да. Вы с таким не сталкивались, значит и идея сама по себе бредовая.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38417788
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Таки нет. :-)Точно! Класс паблик, а метод нет. :)
Алексей Кпропущено...

Ну сделать для него обёртку?
Код: c#
1.
2.
3.
public IQueryable<C> P1 { get { ... } }

public C[] P2 { get { return P1.ToArray(); } }

Какую ещё обёртку? Над чем? Куда обёртка собирается, как её использовать?Обёртку в виде свойства P2, чтобы: " То есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса? Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте. "
skyANAАлексей Кпропущено...
Задачу надо ставить жосче: "А если WPF-морда захочет читать данные напрямую из файлов, в которых хранит MSSQL свои базы". :-)А ну да. Вы с таким не сталкивались, значит и идея сама по себе бредовая. С чем я не сталкивался? С необходимостью иметь в фабрике контекстов свойство ConnectionString, чтобы иметь возможность настраивать подключение, в том числе и к тестовой БД?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38417792
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КИногда мне кажется, что из-за всех этих "паттернов" некоторые забывают базовые принципы ООП и рефакторинга.Хм. Ну вот они: SOLID . Разберём Ваш код? Ну попробуйте. Только обязательно нужна количественная оценка объёма кода, который потребуется написать при добавлении тех или иных возможностей, по сравнению с "правильным" вариантом решения. Голые ссылки на теорию не интересны.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38417796
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAДак у него нет репозитория, он ему и не нужен. Я вообще не понимаю о чём он рассуждает. О том что с IQueryable нет проблем, если база одна, раотает с ней только один сервис и повторное использование кода на фиг не нужно.А меж тем, всё это делается ради расширения возможностей повторного использования.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38417798
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВ "IQueryable-слое" по большому счету смысла особого не вижуЗря. Сам же говорил, что чем больше слоёв - тем лучше. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38417857
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Точно! Класс паблик, а метод нет. :)
пропущено...
Какую ещё обёртку? Над чем? Куда обёртка собирается, как её использовать?Обёртку в виде свойства P2, чтобы: " То есть к примеру нужен он мне в проекте Windows сервиса-а, я тупо добавляю референс на сборку WCF сервиса? Не, ну так можно, кто же спорит. Я к примеру видел как цепляли сборки WinForms в Windows сервисе, чтобы по расписанию формировать отчёт в Excel и отправлять по почте. "Можете написать пример кода, чтобы было понятно к какому классу принадлежит свойство, как оборачивается нужный метод и как этой обёрткой пользоваться?
Алексей КskyANAпропущено...
А ну да. Вы с таким не сталкивались, значит и идея сама по себе бредовая. С чем я не сталкивался? С необходимостью иметь в фабрике контекстов свойство ConnectionString, чтобы иметь возможность настраивать подключение, в том числе и к тестовой БД?С тем, что морду надо подключить напрямую к БД, а не через сервер приложений. Я же вроде ясно написал, будьте внимательнее.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38417858
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУВ "IQueryable-слое" по большому счету смысла особого не вижуЗря. Сам же говорил, что чем больше слоёв - тем лучше. :-)
А смысл? Этот слой с легкостью покрывает универсальный репозиторий. Нафига мне IQueryable лохмотья? :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38417859
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAДак у него нет репозитория, он ему и не нужен. Я вообще не понимаю о чём он рассуждает. О том что с IQueryable нет проблем, если база одна, раотает с ней только один сервис и повторное использование кода на фиг не нужно.А меж тем, всё это делается ради расширения возможностей повторного использования.Что делается? Вот что Вы конкретно сделали для расширения возможности повторного использования, и что было до этого? И с какими проблемами столкнулись (не зря же Вы хотели обсудить некую архитектуру)?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418200
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
Зря. Сам же говорил, что чем больше слоёв - тем лучше. :-)
А смысл? Этот слой с легкостью покрывает универсальный репозиторий. Нафига мне IQueryable лохмотья? :)А действительно. Накой в базе "лохмотья" запросов в виде View/Inline UDF. Срочно убрать, всё должно делаться хранимыми процедурами, имеющими конкретный план выполнения. :-)

Тут тоже самое, IQueryable/Expression - это фрагменты запросов с возможностью их повторного использования. Согласен, гемора с ними больше, но при умелом их применении производительность вырастает в разы.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418202
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
А меж тем, всё это делается ради расширения возможностей повторного использования.Что делается? Вот что Вы конкретно сделали для расширения возможности повторного использования, и что было до этого? И с какими проблемами столкнулись (не зря же Вы хотели обсудить некую архитектуру)?Не парьтесь, Вам это не надо.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418269
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Что делается? Вот что Вы конкретно сделали для расширения возможности повторного использования, и что было до этого? И с какими проблемами столкнулись (не зря же Вы хотели обсудить некую архитектуру)?Не парьтесь, Вам это не надо.Хахаха, мужик, понял, с тобой лучше не общаться. Бывай.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418686
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANA1. Поднимать DbContext в начале запроса, убивать в конце;Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
Сохранение static полей класса между запросами
ХреноРедькаНе гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком.
Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items.
[ThreadStatic]- неудачное решение в контексте ASP.NET.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418741
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
Сохранение static полей класса между запросами
ХреноРедькаНе гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком.
Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items.
[ThreadStatic]- неудачное решение в контексте ASP.NET.К чему тут эта ссылка? ХреноРедька оказался неправ. В том топике ниже опровержение этого утверждения.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418750
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сссылка полезна, т.к. там началось обсуждение ThreadStatic и HttpContext в ASP.Net.
По моему корреляция на лицо.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418764
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAСссылка полезна, т.к. там началось обсуждение ThreadStatic и HttpContext в ASP.Net.
По моему корреляция на лицо.А по-моему - нет. Какое имеет отношение к репозитариям моя реализация управления временем жизни EF-контекста?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418766
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAтам началось обсуждениеОно там давно уже закончилось...
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38418792
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAСсылка полезна, т.к. там началось обсуждение ThreadStatic и HttpContext в ASP.Net.
По моему корреляция на лицо.А по-моему - нет. Какое имеет отношение к репозитариям моя реализация управления временем жизни EF-контекста?Я не собираюсь с Вами дискутировать, но Вы бы читали, что пишите.

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


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