|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... А Вы как обязываете своих разработчиков добавлять такие вот абстракции в проект?Так же как и в остальных случаях. Это могла быть и недостающая вьюха в БД, и всё что угодно, в зависимости от имеющейся архитектуры.То есть никак не обязываете? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:08 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttТолько возвращать можно не IEnumerable<T>, а IQueryable<T> — и я не вижу к каким проблемам это может привести. Тебе уже 10 раз озвучили эти проблемы. Яд на столе. hVosttЗато явный профит вижу. Можно сделать Take и Skip, можно сделать OfType, можно сделать выборку только нужных полей (например, если не хочется для отдельных случаев вытаскивать большой блоб) или дополнительно уточнить запрос динамически ( в тех случаях, когда спецификации уже не подходят, например OData, или кастомный фильтр/сортировщик на гриде ). Это всё делается в реализации метода репозитория. Репозиторий возвращает только то, что нужно потребителю. hVosttЯ считаю, что IQueryable<T> — разработан совсем не для того, чтобы его похоронили где-то на задворках репозитория. Никто его хоронить не будет, просто нужно это использовать в правильных местах. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:09 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУНеправильный ответ. Ты отдаешь IQueryable, чтобы его потом можно было еще дофильтровывать. Так вот о этой дофильтровке и идет речь. В 10 местах ты использовал дофильтровку, потом появился новый признак в БД, который должен учитываться во всех дофильтровках и мы получили в бубен. спецификация. упаковываются такие случае в спецификацию. IQueryable<T> не для дофильтрации. а, например, для построения справочника. пейджинга. уточнения типа (в случае inheritance mapping). сортировки. зачем какой-то ещё огород городить? удобный интерфейс. надо пользоваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:09 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУТебе уже 10 раз озвучили эти проблемы. Яд на столе. плохо озвучили. на счет яда понял. отмазка на случаи "я не знаю, или лесом" ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:10 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЯ говорю про случаи, когда в сервис надо выложить именно "всё". В веб-проектах, вероятно, такое не требуется. Но у меня 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 - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:12 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttIQueryable<T> не для дофильтрации Ты сам себе противоречишь. Вот тут ты сказал: hVosttЗато явный профит вижу. Можно сделать Take и Skip Это таки дофильтрация. Или будешь спорить? hVosttа, например, для построения справочника. пейджинга. уточнения типа (в случае inheritance mapping). сортировки. зачем какой-то ещё огород городить? удобный интерфейс. надо пользоваться. Всё это сделает репозиторий, ты только ему передай ему параметры. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:12 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttЯ считаю, что IQueryable<T>...Считай на здоровье. Статья призвана обратить внимание на возможные проблемы их применения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:14 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КТам трёхзвенка. Я хочу увидеть в вебсервисе объект, соответствующий таблице в БД. То есть у тебя все запросы вида "SELECT * FROM"? Алексей КНе точно так же. Гибкости подставляемых выражений там не добиться. В чем выражена эта гибкость? ) Алексей КFunc<A, B> vs Expression<Func<A, B>> Есть разница? :-) Не придирайся. Разумеется имелось ввиду Expression + Func, а не голый Func в качестве аргумента :) Алексей КIQueryable не может быть результирующим, результирующим может быть List<T>. IQueryable - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе. Не нужен никому фрагмент запроса, потребителю нужен готовый к съедению набор. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:15 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Это проблема не IQueryable как такового, а проблема автора, который не добавил в проект необходимой абстракции. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Неправильный ответ. Ты отдаешь IQueryable, чтобы его потом можно было еще дофильтровывать. Так вот о этой дофильтровке и идет речь. В 10 местах ты использовал дофильтровку, потом появился новый признак в БД, который должен учитываться во всех дофильтровках и мы получили в бубен.Я отдаю IQueryable, чтобы на его базе можно было построить множество запросов. Если фильтр, о котором ты говоришь, нужно сделать в одном месте - он будет сделан в одном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:15 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КЯ отдаю IQueryable, чтобы на его базе можно было построить множество запросов. Если фильтр, о котором ты говоришь, нужно сделать в одном месте - он будет сделан в одном месте. Нельзя этого делать, тебе ж объяснили почему. Если потребуется усечь выборку (новое требование) при помощи [Where IsDeleted = False], тебе придется это делать в 100500 местах прикладного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:18 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КТам трёхзвенка. Я хочу увидеть в вебсервисе объект, соответствующий таблице в БД. То есть у тебя все запросы вида "SELECT * FROM"? В форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ? МСУАлексей КНе точно так же. Гибкости подставляемых выражений там не добиться. В чем выражена эта гибкость? )Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-) МСУАлексей КFunc<A, B> vs Expression<Func<A, B>> Есть разница? :-) Не придирайся. Разумеется имелось ввиду Expression + Func, а не голый Func в качестве аргумента :)У меня телепатор в ремонте. МСУАлексей КIQueryable не может быть результирующим, результирующим может быть List<T>. IQueryable - это фрагмент запроса, как вьюха в БД, которая сама по себе не имеет плана выполнения, план выполнения имеет запрос к вьюхе. Не нужен никому фрагмент запроса, потребителю нужен готовый к съедению набор.Потребители разные бывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:22 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
О чем спор? Что возвращать IEnumerable или IQueryable из репозитория? Конечно первое. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:22 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУАлексей КЯ отдаю 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.
Обрати внимание, IsActive описано в одном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:25 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
from d in D1 опечатка ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:27 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
И кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные. Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто. А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали. Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:28 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
МСУА через выражения это выглядит ещё красивее Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:31 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные. Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто. А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали. Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает. это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:32 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:33 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные. Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто. А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали. Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает. это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL ++ ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:34 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные.Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи. они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:35 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttАлексей Кпропущено... Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи. они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Я о том, что такой подход приведёт к необходимости множества методов типа GetMyEntityByID(int id) , что в свою очередь приведёт к N+1. IQueryable избавляет от этой напасти. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttskyANAИ кстати люди постоянно забывают, что репозиторий призван скрыть от нас то, как распредены данные. Сегодня вы используете SQL Server, EF и OData, всё глатко и пушисто. А завтра часть данных берётся из NoSQL хранилища, кэшируется в Couchbase... И приехали. Пишите, Шура, пишите новые IQueryProvider-ы, а то что-то ни фига не работает. это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры? P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:38 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
skyANAhVosttпропущено... это единственный разумный аргумент. но с другой стороны, для более менее популярных хранилищ LINQ провайдеры активно пишутся. это как стандарт де-факто. практически тоже самое можно прикатать даже к SQL А много ты знаешь НЕ реляционных хранилищ, что поддерживают запросы в каком-либо виде? А для каких из них реализованы LINQ провайдеры? P.S.: плюс данные могут браться и не из нашего хранилища, а запрашиваться со сторонних сервисов (наших партнёров, публичных и т.п.).Речь идёт о реализации логики к одной SQL базе. Понятно, что если баз много или они не-SQL, IQueryable тут вряд ли пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
hVosttАлексей Кпропущено... Если мы готовы к "N+1", можно и скрыть. Всё зависит от задачи. они просто говорят о репозитории, который является и в то же время моделью. модель (в понимании MVC), даже близко не является репозиторием, она его использует. это видимо и есть N+1 в вашем понимании.Репозиторий, что является и в то же время моделью. Жжёшь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:40 |
|
IRepository как пользоваться
|
|||
---|---|---|---|
#18+
Алексей КВ форму редактирования уходит объект, сгенерированный по таблице из базы. Это select * from ? Почему он должен быть "select * from"? А если там еще 10 блоб полей, а если там еще секурность, а если там еще логика - давать поле или не давать. За это отвечает репозиторий, который умеет работать с ISecurityService (через IoC). Алексей КМСУпропущено... В чем выражена эта гибкость? )Тут в двух словах не расскажешь, бери пробуй. Я попробовал - мне понравилось. :-) Ну давать в трёх словах, мы не торопимся :) Алексей КАх вот ты о чём. :-) То есть фильтруем на сервере приложений и фильтруем это же поле и на подписчиках? Изящно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:43 |
|
|
start [/forum/topic.php?fid=17&msg=38414613&tid=1349917]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 256ms |
total: | 390ms |
0 / 0 |