powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Передача лямбды в репозиторий. Где ошибка?
25 сообщений из 130, страница 4 из 6
Передача лямбды в репозиторий. Где ошибка?
    #39807379
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatВот, типичный пример кода, наподобии того, который у нас в репах:

Код: c#
1.
2.
3.
4.
5.
public async Task<IEnumerable<Foo>> GetFoos() {
    using(var context = new Context()) {
        return await context.Foos.ToListAsync();
    }
}



Ну так тут нет и даже не пахнет никакими отложенными вычислениями.
Почему бы тогда не вернуть IReadOnlyCollection, например?

А если хочется отложенных запросов и полного вагона преимуществ, почему не вернуть IQueryable?

Какое-то упорное жевание кактуса. Как много я такого в чужих проектах видел, люди вы так любите боль? :))
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807380
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatПроблема в инкапсуляции. Сегодня внутри репо список, а завтра окажется HashSet.

Эмм.. IQueryable -- отличная инкапсуляция в рамках ORM.

Если хотите инкапсулироваться по самые помидоры, чтоб всё-всё можно было заменить (мы каждую неделю меняем СУБД, ОРМ-ы и даже языки программирования и платформы, в живых проектах), тогда тут репо, боюсь, не выстоит под напором требований. В CQRS уходить нужно, или как минимум в Query Object.

Но IEnumerable тут вообще не решает задачу, так как никакими отложенными вычислениями тут не пахнет. Извините, но нет. А вот проблем создаёт. Тупо, количество приходится считать переходом, до идиотизма уже.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807381
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttА если хочется отложенных запросов и полного вагона преимуществ, почему не вернуть IQueryable?

Потому что не везде тот же сиквел, и не везде даже EF. Поэтому не любой IQueryable будет поддерживать любой LINQ запрос. И каждый раз гадать - выполнится он или кинет "unsupported" иксепшен никто не хочет. Говорили же выше - слой репо - это слой абстракции над хранилищами, а не просто ничего не делающая по сути обертка над DbContext.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807382
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttмы каждую неделю меняем СУБД, ОРМ-ы и даже языки программирования и платформы, в живых проектах
Мы не меняем их каждую неделю. У нас их просто и так есть стопитсот разных. И работать мы с ними хотим единообразно.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807386
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatПотому что не везде тот же сиквел, и не везде даже EF. Поэтому не любой IQueryable будет поддерживать любой LINQ запрос. И каждый раз гадать - выполнится он или кинет "unsupported" иксепшен никто не хочет. Говорили же выше - слой репо - это слой абстракции над хранилищами, а не просто ничего не делающая по сути обертка над DbContext.

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

Вообще, решать задачу будущей замены ORM/EF/СУБД -- это удел джунов. Без обид, я сам таким болел когда-то. Это никому не нужная, бесполезная, настолько же беспощадная как и бессмысленная задача. Никто никогда не меняет ни ORM, ни СУБД на живых проектах. А даже если и приходится менять, то никакого волшебства никогда не получится, даже если в лоб расшибиться на абстракциях.

Слой репо это по большему счёту не абстракция над хранилищем, а абстракция над данными. Когда вы это поймёте, получите буст по скиллу.

Это значит, что рано или поздно вам понадобится: кеширование, метрика, безопасность, масштабирование, блокировки, распределение по различным хранилищам и т.д.

И дело вовсе не в "exception", которого вы так боитесь от LINQ запроса. EF такие проекты вывозит, вам и не снилось. Поэтому если занимаетесь глупостями с возвратом IEnumerable вместо IQueryable, то конечно ваше дело, рано или поздно поймёте, что фигнёй страдали :)
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807387
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

В ином случае, репо для целей полной абстракции от хранилища работает очень плохо. Прям очень.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807388
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ уже писал что в этом случае делать нужно. Возвращать IQueryable.
Если же у пациента на IQueryable болезненный (и абсолютно не обоснованный) пунктик, тогда он должен возвращать интерфейс коллекции, а не заниматься фигнёй.

ты писал, что это "перечисление, которое может быть или бесконечным генератором, или иметь свойство одноразового применения и за его использование убивать надо". Вроде ничего из твоего бредогенератора не упустил. Дошло наконец, что не будет у репозитория никаких проблем со множественным перечислением IEnumerable? Гуд, одну шизу вылечили. А IQueryable вообще здесь из другой оперы, показывает только, что ты ничего кроме своего магазина с губной помадой не делал размазывая код запросов по всей системе

hVosttВ этом и дело, IEnumerable крайне абстрактная структура. Приделать асинхронную материализацию невозможно. Сделать трансляцию в запрос невозможно. Сменить способ реализации отложенного вычисления невозможно.

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

hVosttНу так тут нет и даже не пахнет никакими отложенными вычислениями.
Почему бы тогда не вернуть IReadOnlyCollection, например?

нет никакого криминала вернуть и IReadOnlyCollection, но IEnumerable более общий и вполне достаточный для большинства операций
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807389
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordты писал, что это "перечисление, которое может быть или бесконечным генератором, или иметь свойство одноразового применения и за его использование убивать надо". Вроде ничего из твоего бредогенератора не упустил. Дошло наконец, что не будет у репозитория никаких проблем со множественным перечислением IEnumerable? Гуд, одну шизу вылечили. А IQueryable вообще здесь из другой оперы, показывает только, что ты ничего кроме своего магазина с губной помадой не делал размазывая код запросов по всей системе

Я от вас когда-нибудь дождусь связанной осмысленной речи, или вы так и будете быдлить?


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

У вас какой-то болезненный пунктик про помадные магазинчики, это пока всё что понятно из ваших комментариев.


stenfordнет никакого криминала вернуть и IReadOnlyCollection, но IEnumerable более общий и вполне достаточный для большинства операций

Вроде уже все сказал по этому поводу, эти интерфейсы не просто так добавили. А если бы вы изволили потрудиться, то нагуглили бы материалы по этой теме. А был бы опыт разработки чего-то большего чем, как вы там сказали, "помадных магазинчиков", тогда бы вас волновали вопросы производительности, правильной семантики и надёжности кода. Но видимо это не про вас.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807390
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ от вас когда-нибудь дождусь связанной осмысленной речи, или вы так и будете быдлить?

я спросил, дошло-ли до тебя что проблем с множественным перечислением у IEnumerable за которые ты собирался убивать у репозиториев не будет? Или переформулировать этот вопрос в еще более простой форме?

hVosttВроде уже все сказал по этому поводу, эти интерфейсы не просто так добавили. А если бы вы изволили потрудиться, то нагуглили бы материалы по этой теме. А был бы опыт разработки чего-то большего чем, как вы там сказали, "помадных магазинчиков", тогда бы вас волновали вопросы производительности, правильной семантики и надёжности кода. Но видимо это не про вас.
во фрейворках много чего появляется, это не означает что надо автоматически не думая хватать новые фичи и пихать их в каждую щель. IEnumerable вполне адекватный интефейс для репозиториев для возврата коллекций, а уж каких-то причин обязательно использовать IReadOnlyCollection вместо него и тем более нет
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807419
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttfkthat,

В ином случае, репо для целей полной абстракции от хранилища работает очень плохо. Прям очень.

Работает очень хорошо. Ты, походу, никак не понимаешь, что наружу там не торчит никакого ни LINQ ни EF, ничего подобного. Мы возвращаем только уже готовые объекты или коллекции объектов, выбранные по некоторым нужным нам критериям. Что там при этом внутри все это скрыто. Есть скажем интерфейс:
Код: c#
1.
2.
3.
4.
5.
6.
public interface IFooRepo {
   ...
   Task<IEnumerable<Foo>> FindAsync(Query query);
   Task<Foo> GetAsync(Guid id);
   ...
}


У сиквельного репо реализации Find и Get будут одни, у монговского другие и т.п. А снаружи это без разницы и с т.ч. клиента выглядит одинаково.

А в твоем ошибочном представлении репо это что-то такое:
Код: c#
1.
2.
3.
public interface IFooRepo {
   IQueryable<Foo> Get();
}


И в таком, твоем репо, действителььно никакого смысла нет - что за резон просто тупо возвращать свойство контекста - да его и так можно напрямую брать.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807425
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
А зчем task, async в каждой строке кода?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807429
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
Весь вопрос в асинхронности.
Если она нужна, то вы правы, если нет, то вполне возврат можно делать List или Collection.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807435
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthat,
Весь вопрос в асинхронности.
Если она нужна, то вы правы, если нет, то вполне возврат можно делать List или Collection.
Асинхронность нужна практически всегда, потому что репо работает с I/O. Не пойму тебя - как асинхронность может влиять на то возвращать ли IEnumerable или List?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807440
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
1. Асинхронность мало когда нужна. По умолчанию код должен быть не асинхронный. Так в java.
2. Асинхронность это накладные расходы. Будет медленнее.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807441
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
Я много работаю с коллекциями по проекту (GIS). Там коллекции нужны для правки. IEnumerable только чтение?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807442
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
4. Нужно быть всегда готовым заменить EF на NHiber.
Боюсь там все по другому и код придется переписать.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807446
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthat,
1. Асинхронность мало когда нужна. По умолчанию код должен быть не асинхронный. Так в java.
2. Асинхронность это накладные расходы. Будет медленнее.
Ну эт потому что ты, наверное, под десктоп пишешь. А у нас веб и асинхронность нужна именно что всегда. При чем тут жава. В Си вон вообще объектов нет.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807448
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthat,
4. Нужно быть всегда готовым заменить EF на NHiber.
Боюсь там все по другому и код придется переписать.
А вот как раз в этом случае все изменения и будут внутри репо, а все внешнее это вообще никак не затронет.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807455
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatА у нас веб и асинхронность нужна именно что всегда. в java это делает контейнер аппСервера. Он запускает доп потоки когда нужно. Код не надо специально помечать символами..
Непонятно почему у MS так странно.
fkthatПри чем тут жава.шарп жаваа и c++ братья)))
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807456
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatPetro123fkthat,
4. Нужно быть всегда готовым заменить EF на NHiber.
Боюсь там все по другому и код придется переписать.
А вот как раз в этом случае все изменения и будут внутри репо, а все внешнее это вообще никак не затронет.делают два метода. Синхронный и асинхронный.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807458
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatА у нас веб и асинхронность нужна именно что всегда.зачем?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807462
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthatА у нас веб и асинхронность нужна именно что всегда. в java это делает контейнер аппСервера. Он запускает доп потоки когда нужно. Код не надо специально помечать символами..
Непонятно почему у MS так странно.
fkthatПри чем тут жава.шарп жаваа и c++ братья)))

У тебя просто полное непонимание, как работает async/await и для чего он, в случае веба, нужен. Рекомендую погуглить и разобраться в этом. С дополнительными потоками или выполнением чего-то в бекграунде он вообще никак не связан. Он просто позволяет намного более эффективно использовать уже имеющиеся потоки из пула.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807464
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthatА у нас веб и асинхронность нужна именно что всегда.зачем?
Затем, что потоков огранниченное количество и async/await дает возможность параллельно обрабатывать большее количество запросов.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807474
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
Ты пропускаешь мои аргументы.
MS рекумендует иметь по два метода. Асинхронно и синхронно. Одним не обойтись.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807475
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatPetro123пропущено...
зачем?
Затем, что потоков огранниченное количество и async/await дает возможность параллельно обрабатывать большее количество запросов.т.е. прикладник Вася должен заботится о параметрах железа в коде?
Этим аппСервер занимается. Ну еще пул потоков MS.
...
Рейтинг: 0 / 0
25 сообщений из 130, страница 4 из 6
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Передача лямбды в репозиторий. Где ошибка?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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