powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Передача лямбды в репозиторий. Где ошибка?
130 сообщений из 130, показаны все 6 страниц
Передача лямбды в репозиторий. Где ошибка?
    #39798485
Maksimka-27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разбираю Pro Entity Framework Core 2 for ASP.NET Core MVC замечательного автора Adam Freeman.

Строится модель, например:
public class Product
{
public long Id { get; set; }
public string Name { get; set; }
[Column(TypeName = "decimal(18, 2)")]
public decimal PurchasePrice { get; set; }
}

Строим класс репозитория (объявление контекста и интерфейса- опускаю):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class DataRepository : IRepository
    {
        
        private DataContext context;

        public DataRepository(DataContext ctx) => context = ctx;

       public IEnumerable<Product> ProductsChoose(Func<Product, bool> func)
          {
            IEnumerable<Product> p = context.Products
                    .Where(func)
                    .ToList();    
            return p;   
           }



В контроллере идет вызов:
Код: c#
1.
     IEnumerable<Product> p = repository.ProductsChoose(x => x.RetailPrice < 100);



При этом формируется SQL:
Код: sql
1.
2.
3.
Executed DbCommand (31ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [p].[Id], [p].[CategoryId], [p].[Name], [p].[PurchasePrice], [p].[RetailPrice]
FROM [Products] AS [p]



Но если я переписываю репозиторий ():

Код: c#
1.
2.
3.
4.
5.
6.
public IEnumerable<Product> ProductsChoose(Func<Product, bool> func)
          {
            IEnumerable<Product> p = context.Products
                    .Where(x => x.RetailPrice < 100)
                    .ToList();    
            return p;   }



[то получаю вполне ожидаемый код, который ведет отбор на сервере базы данных:
Код: sql
1.
2.
3.
SELECT [x].[Id], [x].[CategoryId], [x].[Name], [x].[PurchasePrice], [x].[RetailPrice]
FROM [Products] AS [x]
WHERE [x].[RetailPrice] < 100.0



При этом результаты вывода - одинаковые.
Почему передача лямбды в репозиторий приводит к фильтрации строк на стороне EF а не SQL?
Где я ошибаюсь?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798514
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maksimka-27,
Скорее всего проблема в отложенном выполнении, реальное преобразование в запрос происходит на момент вычисления всей цепочки, ваш внешний func не может заинжектиться корректно, что логично. Надо смотреть в доке как разбирается Linq
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798521
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробуй
Код: c#
1.
ProductsChoose(Expression<Func<Product, bool>> func)
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798555
Maksimka-27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Помогло, Спасибо!!!!
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798594
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maksimka-27Разбираю Pro Entity Framework Core 2 for ASP.NET Core MVC замечательного автора Adam Freeman.хмм...
А MS со своим кодом ниже в пику ему делает свои справки и демки?
dotnet ef dbcontext scaffold xxxxxxxxxx
И получаем вместо репозитория класс XXXContext.cs
?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798600
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фримен упирает на модульное тестирование, поэтому интерфейс для репозитория в примере - вполне в его стиле.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798609
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Спс.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798635
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proпробуй
Код: c#
1.
ProductsChoose(Expression<Func<Product, bool>> func)


+1
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798685
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maksimka-27
Код: c#
1.
IEnumerable<Product>



IQueryable
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798698
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttMaksimka-27
Код: c#
1.
IEnumerable<Product>




IQueryableтогда
.ToList();
будет лишним?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798768
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123.ToList();
будет лишним?

делать ToList() и возвращать IEnumerable сродни тому, как плюнуть в лицо :)

хотя бы ICollection, хотя желательно IReadOnlyCollection

касательно озвученной проблемы, правильно решается с помощью паттерна спецификаций, например:

https://enterprisecraftsmanship.com/2016/02/08/specification-pattern-c-implementation/
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798817
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttделать ToList() и возвращать IEnumerable сродни тому, как плюнуть в лицо :))))
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798823
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttделать ToList() и возвращать IEnumerable сродни тому, как плюнуть в лицо :)Кстати, слышал как-то формулу - параметр метода должен быть максимально абстрактного типа, результат - максимально конкретного. Скажи, гуру, ты согласен с этой формулой?

То есть, в данном случае, вернуть прямо таки List<>. Если потребителю нужен ICollection - он сам выполнит приведение. А может ему понадобится непосредственно функционал листа.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39798827
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЕсли потребителю нужен ICollection - он сам выполнит приведение.с этим не согласен.
Возвращать нужно то что просят выше. Чтобы 200 вызовов не приводить и кода не добавлять.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39799068
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProКстати, слышал как-то формулу - параметр метода должен быть максимально абстрактного типа, результат - максимально конкретного. Скажи, гуру, ты согласен с этой формулой?

Главное не путать абстракцию с семантикой.

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

самая максимальная абстракция коллекции в C# это IReadOnlyCollection.

Shocker.ProТо есть, в данном случае, вернуть прямо таки List<>.

Ни в коем случае. List это реализация. Вообще самые злостные крайности джунов это возвращать IEnumerable, или List. Ругаю очень за такое.

Shocker.ProЕсли потребителю нужен ICollection - он сам выполнит приведение. А может ему понадобится непосредственно функционал листа.

Я говорю конкретно про контракты.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39799129
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНи в коем случае. List это реализация. Вообще самые злостные крайности джунов это возвращать IEnumerable, или List. Ругаю очень за такое.не понял. Я налево и направо возвращаю.
А что делать, если наверху правят эту коллекцию?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39799178
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123hVosttНи в коем случае. List это реализация. Вообще самые злостные крайности джунов это возвращать IEnumerable, или List. Ругаю очень за такое.не понял. Я налево и направо возвращаю.
А что делать, если наверху правят эту коллекцию?
надо вернуть метаданные - адрес памяти, длина блока памяти
а там пусть как хотят так и интерпретируют
а то всякие там коллекции и т.д. не кошерны
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39799188
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosнадо вернуть метаданные - адрес памяти, длина блока памятив Net есть Pointer или *p
?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39799231
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123не понял. Я налево и направо возвращаю.
А что делать, если наверху правят эту коллекцию?

если коллекция может правиться, то ICollection.
если к этому нужен индексированный доступ, то IList.

контракты должны быть максимально абстрактными, но не нарушать семантику.
а то можно вообще везде object возвращать, чё мелочиться-то? :)
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39799280
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttIQueryable
руки отрубать за такое надо. Логика запросов расползется по всем слоям убив поддерживаемость и производительность
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39799290
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordhVosttIQueryable
руки отрубать за такое надо. Логика запросов расползется по всем слоям убив поддерживаемость и производительность

серьёзно? за много лет мне ещё никто не доказал и не показал, что там "убивается" в поддержке и производительности

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

работай со слоем доступа к данным из слоя логики, не тащи на клиентский слой, в чём проблемы?

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

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

работай со слоем доступа к данным из слоя логики, не тащи на клиентский слой, в чём проблемы?

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

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

про репозитории вида god queries object уже писалось не раз, обсуждалось. то, что вы слыхом про это не слыхивали, проблемы только ваши.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39799452
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordна первых годах своей работы пока не поднаберутся опыта

как я вижу, многим и десятки лет опыта ничего не дают. как лепят свои унылые поделки, которые освоили на студенческих примерах, так и продолжают лепить до посинения.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39800739
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maksimka-27Разбираю Pro Entity Framework Core 2 for ASP.NET Core MVC замечательного автора Adam Freeman.

Строится модель, например:
public class Product
{
public long Id { get; set; }
public string Name { get; set; }
[Column(TypeName = "decimal(18, 2)")]
public decimal PurchasePrice { get; set; }
}

Строим класс репозитория (объявление контекста и интерфейса- опускаю):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class DataRepository : IRepository
    {
        
        private DataContext context;

        public DataRepository(DataContext ctx) => context = ctx;

       public IEnumerable<Product> ProductsChoose(Func<Product, bool> func)
          {
            IEnumerable<Product> p = context.Products
                    .Where(func)
                    .ToList();    
            return p;   
           }



В контроллере идет вызов:
Код: c#
1.
     IEnumerable<Product> p = repository.ProductsChoose(x => x.RetailPrice < 100);



При этом формируется SQL:
Код: sql
1.
2.
3.
Executed DbCommand (31ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [p].[Id], [p].[CategoryId], [p].[Name], [p].[PurchasePrice], [p].[RetailPrice]
FROM [Products] AS [p]



Но если я переписываю репозиторий ():

Код: c#
1.
2.
3.
4.
5.
6.
public IEnumerable<Product> ProductsChoose(Func<Product, bool> func)
          {
            IEnumerable<Product> p = context.Products
                    .Where(x => x.RetailPrice < 100)
                    .ToList();    
            return p;   }



[то получаю вполне ожидаемый код, который ведет отбор на сервере базы данных:
Код: sql
1.
2.
3.
SELECT [x].[Id], [x].[CategoryId], [x].[Name], [x].[PurchasePrice], [x].[RetailPrice]
FROM [Products] AS [x]
WHERE [x].[RetailPrice] < 100.0



При этом результаты вывода - одинаковые.
Почему передача лямбды в репозиторий приводит к фильтрации строк на стороне EF а не SQL?
Где я ошибаюсь?

а нафига вообще такой репозиторий?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39800743
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachа нафига вообще такой репозиторий?чтобы тестить удобно было). А писать сложно).
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39800750
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123love_bachа нафига вообще такой репозиторий?чтобы тестить удобно было). А писать сложно).

EF context можно мокнуть при желании. а все условия фильтрации, да и не только, там из каробки есть. паттерно-болезнь
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39800831
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachа нафига вообще такой репозиторий?
затем, что вместо кодирования сотен/тысяч строк бессмысленного кода мокинга EF и хождения по заботливо разложенным граблям этого фрейворка можно писать бизнес-логику и другие полезные вещи
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802043
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttShocker.ProКстати, слышал как-то формулу - параметр метода должен быть максимально абстрактного типа, результат - максимально конкретного. Скажи, гуру, ты согласен с этой формулой?

Главное не путать абстракцию с семантикой.

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

самая максимальная абстракция коллекции в C# это IReadOnlyCollection.

Shocker.ProТо есть, в данном случае, вернуть прямо таки List<>.

Ни в коем случае. List это реализация. Вообще самые злостные крайности джунов это возвращать IEnumerable, или List. Ругаю очень за такое.

Shocker.ProЕсли потребителю нужен ICollection - он сам выполнит приведение. А может ему понадобится непосредственно функционал листа.

Я говорю конкретно про контракты.


Какие коллекции в итоге нужно принимать и возвращать?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802074
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachEF context можно мокнуть при желании. а все условия фильтрации, да и не только, там из каробки есть. паттерно-болезнь
Имеет смысл, когда, например, несколько разных стореджей и не для всех годится EF. Чтобы всю работу с данными сделать единообразной.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802102
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
По русски напиши - две разные базы в одном проекте.
Только я не видел такого никогда).
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802114
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthat,
По русски напиши - две разные базы в одном проекте.
Только я не видел такого никогда).

"Ты просто мал и глуп, и не видал больших за..уп" (с) У нас, например, одновременно сиквел, монга, и еще какая-то экзотика от амазона, названия которой я даже и не ведаю.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802140
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
В одном проекте? Значит плохая архитектура))
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802244
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthat,
В одном проекте? Значит плохая архитектура))

Просто проект большой.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802437
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatlove_bachEF context можно мокнуть при желании. а все условия фильтрации, да и не только, там из каробки есть. паттерно-болезнь
Имеет смысл, когда, например, несколько разных стореджей и не для всех годится EF. Чтобы всю работу с данными сделать единообразной.

а будет ли оно, это однообразие? один полноценно поддерживание LINQ, другой частично, третий нет. один работает с SQL, другой нет. в одном реализован UoW, в другом нет. и т.д. и т.п.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802492
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatPetro123fkthat,
По русски напиши - две разные базы в одном проекте.
Только я не видел такого никогда).

"Ты просто мал и глуп, и не видал больших за..уп" (с)
У нас, например, одновременно сиквел, монга, и еще какая-то экзотика от амазона, названия которой я даже и не ведаю.
Dynamodb
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802495
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANADynamodbхм, не слишком удачное название для СУБД
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802498
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatlove_bachEF context можно мокнуть при желании. а все условия фильтрации, да и не только, там из каробки есть. паттерно-болезнь
Имеет смысл, когда, например, несколько разных стореджей и не для всех годится EF. Чтобы всю работу с данными сделать единообразной.
+1

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

Да и обсуждалось уже на этом форуме то, зачем нужен репозитории. В книгах и статьях обсосано.
Но народ все продолжает линию: мне вот сейчас не нужен, итак вроде все работает, значит вообще никому не нужен.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802507
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProskyANADynamodbхм, не слишком удачное название для СУБД

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

Нужен абстрактный слой доступа к данным. В общем и целом паттерн Репозиторий, среди сотен его интерпретаций, лишь одна из реализаций подобного слоя. И не всем он подходит, а при неправильном употреблении превращается больше в проблему, чем в преимущества (repository god object, например).
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39802983
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПри этом на доступ к данным необходимо наложить распределенные блокировки :)

Бизнес-транзакции, саги, оптимистичные блокировки, версионирование...

Как бы распределённые блокировки это не обязательно про данные, если более 1 апп ноды даже с одной БД.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803032
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAДа и обсуждалось уже на этом форуме то, зачем нужен репозитории. В книгах и статьях обсосано.

Нужен абстрактный слой доступа к данным. В общем и целом паттерн Репозиторий, среди сотен его интерпретаций, лишь одна из реализаций подобного слоя.
Да, но пациенты даже одну реализацию осилить не могут.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803033
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttИ не всем он подходит, а при неправильном употреблении превращается больше в проблему, чем в преимущества (repository god object, например).
Превращается, когда шаблон "прямые руки" забывают применять :)
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803035
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAПри этом на доступ к данным необходимо наложить распределенные блокировки :)

Бизнес-транзакции, саги, оптимистичные блокировки, версионирование...

Как бы распределённые блокировки это не обязательно про данные, если более 1 апп ноды даже с одной БД.Да, да, да...

Но суть в том, что люди на своих проектах ничего этого не видят, а выводы делают.
Хотя информации для изучения вагон и маленькая тележка.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803541
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухhVosttпропущено...


Бизнес-транзакции, саги, оптимистичные блокировки, версионирование...

Как бы распределённые блокировки это не обязательно про данные, если более 1 апп ноды даже с одной БД.Да, да, да...

Но суть в том, что люди на своих проектах ничего этого не видят, а выводы делают.
Хотя информации для изучения вагон и маленькая тележка.

для ТС репозиторий не нужен. а это все "Бизнес-транзакции, саги, оптимистичные блокировки, версионирование..." к репозиторию не имеет отношения
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803543
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухhVosttпропущено...


Бизнес-транзакции, саги, оптимистичные блокировки, версионирование...

Как бы распределённые блокировки это не обязательно про данные, если более 1 апп ноды даже с одной БД.Да, да, да...

Но суть в том, что люди на своих проектах ничего этого не видят , а выводы делают.
Хотя информации для изучения вагон и маленькая тележка.

будь проще, не бомби
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803546
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухhVosttпропущено...


Нужен абстрактный слой доступа к данным. В общем и целом паттерн Репозиторий, среди сотен его интерпретаций, лишь одна из реализаций подобного слоя.
Да, но пациенты даже одну реализацию осилить не могут.

пример, как кто-то из "пациентов не осилил" сможешь привести?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803548
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухhVosttИ не всем он подходит, а при неправильном употреблении превращается больше в проблему, чем в преимущества (repository god object, например).
Превращается, когда шаблон "прямые руки" забывают применять :)

это рекомендация лида? или просто не удачно сформулировал?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803651
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachдля ТС репозиторий не нужен. а это все "Бизнес-транзакции, саги, оптимистичные блокировки, версионирование..." к репозиторию не имеет отношения

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

Ну все хотят какое-то одно единственно верное и прямое решение на все времена.
Осиливают какой-то один кривой подход и всё, живой станок по производству ПО готов)))
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803684
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttlove_bachдля ТС репозиторий не нужен. а это все "Бизнес-транзакции, саги, оптимистичные блокировки, версионирование..." к репозиторию не имеет отношения

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

как-то очень вежливо для hVostt сформулировано. может это не ты? :)
ТС делает обертку над EF, которую именует "Репозиторий". Он считает это нужным. Флаг ему в руки. Я так не считаю.
"Бизнес-транзакции" - ну и где тут необходимость именно "Репозитория"?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803707
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subКакие коллекции в итоге нужно принимать и возвращать?
из репозитория в данном случае - IEnumerable, это read only сортируемая коллекция, которая обычно и требуется
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803723
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachДмитрий Мухпропущено...
Да, да, да...

Но суть в том, что люди на своих проектах ничего этого не видят, а выводы делают.
Хотя информации для изучения вагон и маленькая тележка.

для ТС репозиторий не нужен
ТС написал, что разбирает книгу "Pro Entity Framework Core 2 for ASP.NET Core MVC" замечательного автора Adam Freeman.
Думаю он сам решит, что делать с прочитанным материалом и практическими примерами.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39803775
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessypvb_subКакие коллекции в итоге нужно принимать и возвращать?
из репозитория в данном случае - IEnumerable, это read only сортируемая коллекция, которая обычно и требуетсяпочему только чтение. Люди счас любят всё и сразу)
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807246
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessypиз репозитория в данном случае - IEnumerable, это read only сортируемая коллекция, которая обычно и требуется

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public class Repeater<T>
    {
        private readonly T _value;
        private int _count;

        public Repeater(T value, int count)
        {
            _value = value;
            _count = count;
        }

        public IEnumerable<T> GetList()
        {
            while (_count-- > 0)
            {
                yield return _value;
            }
        }
    }



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

Использование IEnumerable и List не по назначению -- это один из признаков джуна. К моему величайшему сожалению, многие джунами остаются с опытом 5 и более лет.

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

Ну так если клиенту нужно что-то другое, то он возьмет уже и сам превратит IEnumerable в это что-то другое. Репозиторий как раз и не должен ничего заранее знать про то, что какому клиенту понадобится.

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

Это очень плохой аргумент. Потому что исходя из этого, нужно тогда вообще возвращать byte[], а клиент там пусть "превращает". Если по семантике возвращается коллекция, то это должна быть коллекция, а не бесконечное перечисления, так как у коллекции есть как минимум известное количество, а клиент ожидает, что по коллекции можно ходить много раз.

Разумеется, что получив IEnumerable, клиент обязан превратить его в ToArray/ToList, и почувствовать себя при этом тупой обезьяной.

fkthatРепозиторий как раз и не должен ничего заранее знать про то, что какому клиенту понадобится.

Он не должен знать для чего, а что может понадобиться знать прямо таки обязан.

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

Так что это ещё один плохой аргумент.

fkthatА пример твой, так он просто косячный, потому что репо должен возвращать готовую коллекцию, но возвращать её как IEnumerable.

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

Ладно, лень спорить. Воля ваша - возвращайте что хотите, мне какая печаль-то
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807264
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

а откуда ты сам взял это своё бесконечное перечисление?

IEnumerable предоставляет простую итерацию над коллекцией. Он не является каким-то бесконечным перечислением.

Ты видел вообще когда-нибудь в жизни то, чем тут народ пугаешь?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807268
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКоллекция должна быть коллекцией, вести себя как коллекция и быть коллекцией. Подмена понятий в адекватной разработке не уместна. Не умение работать с типами это признак джуна, и оправданий тут быть не может. Косячишь в одном месте -- значит косячишь везде.
ты-же даже не понял что тебе написали, отложенное исполнение IEnumerable возможно только в случае если репозиторий не привел результат в коллекцию, если-же коллекция уже сформирована но возвращена в виде IEnumerable - никакого множественного перечисления не возникнет, ты судя по-всему не понимаешь базовых вещей о том, как работают такие типы.
Далее, если репозиторий все-же позволяет отложенное исполнение - это значит контекст там один на всех, и делать так плохая идея т.к. в EF он не потокобезопасен, но даже в этом случае это не повод возвращать коллекции вместо более общего типа обосновывая это тем, что ты не понимаешь как правильно работать с IEnumerable

hVosttповбывав бы за IEnumerable

да никого ты не убиваешь, судя по всему ты фрилансер т.к. за милю чувствуется отсутствие опыта работы в команде и навыков совместного обсуждения проблем, такая ослиная упертость в отстаивании каких-то совершенно диких идей и бабские истерики когда тебя тыкают мордой в твои ляпы обычно вырабатываются годами сидения в одиночку перед компьютером
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807286
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordДалее, если репозиторий все-же позволяет отложенное исполнение - это значит контекст там один на всех,железное правило?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807305
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123stenfordДалее, если репозиторий все-же позволяет отложенное исполнение - это значит контекст там один на всех,железное правило?
Необязательно. Запросто можно нормально возвращать и отложенное. Просто надо с умом делать.

Плохо:
Код: c#
1.
2.
3.
4.
5.
private _context = new Context();

public IEnumerable<SomeData> GetSomeData() {
   return _context.SomeData;
}



А вот это будет норм:
Код: c#
1.
2.
3.
4.
public IEnumerable<SomeData> GetSomeData() {
   var context = new Context();
   return context.SomeData;
}



Хотя и второй вариант не есть гуд, т.к. проблемы с диспозом контекста и т.п. В общем, тут как и везде - надо просто понимать как это работает, и что ты делаешь. Самый распространенный баг, что я встречал, это:
Код: c#
1.
2.
3.
4.
5.
public IEnumerable<Entity> GetEntities() {
    using(var context = new Context()) {
        return context.Entities;
    }
}
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807325
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Муха откуда ты сам взял это своё бесконечное перечисление?
IEnumerable предоставляет простую итерацию над коллекцией. Он не является каким-то бесконечным перечислением.

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

Дмитрий МухТы видел вообще когда-нибудь в жизни то, чем тут народ пугаешь?


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

Я уже писал что в этом случае делать нужно. Возвращать IQueryable.
Если же у пациента на IQueryable болезненный (и абсолютно не обоснованный) пунктик, тогда он должен возвращать интерфейс коллекции, а не заниматься фигнёй.


stenfordДалее, если репозиторий все-же позволяет отложенное исполнение - это значит контекст там один на всех

Серьёзно? Прям один на всех? Это из какой такой реальности? Про lifetime scope слышали?


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

Аргументы, так и не начавшись, кончились, попёрло низкосортное быдлячество.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807328
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatА вот это будет норм:
Код: c#
1.
2.
3.
4.
public IEnumerable<SomeData> GetSomeData() {
   var context = new Context();
   return context.SomeData;
}



А теперь материализуйте результат асинхронно. Покажете как это сделать?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807330
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttА теперь материализуйте результат асинхронно. Покажете как это сделать?
А про асинхронность нигде не говорилось. Это просто был пример, что отложенное перечисление в принципе возможно. Я бы и сам такой код не стал писать.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807332
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блеать, вот казалось бы. а и тут возможен срач!
репо нахер не нужен, за редкими случаями. абстракция на хранилищем
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807333
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttfkthatА вот это будет норм:
Код: c#
1.
2.
3.
4.
public IEnumerable<SomeData> GetSomeData() {
   var context = new Context();
   return context.SomeData;
}



А теперь материализуйте результат асинхронно. Покажете как это сделать?

ты несешь какую-то дичь. угомонись, уже
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807343
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachблеать, вот казалось бы. а и тут возможен срач!
репо нахер не нужен, за редкими случаями. абстракция на хранилищем
Я еще раз скажу - все зависит от масштабов. У нас проект, например, порядка трех десятков микросервисов, десятка полтора-два всевозможных хранилищ, внешние источники данных, счет всевозможным сущностям идет на сотни. Вот тогда начинаешь понимать, зачем все эти самые "абстракции над хранилищем" нужны. А интернет-магазинчик губной помады написать - там прослойка репо и вправду не нужна.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807352
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatPetro123железное правило?
Необязательно. Запросто можно нормально возвращать и отложенное. Просто надо с умом делать.значит весь его пост вообще бездоказательный набор букв.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807369
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVosttА теперь материализуйте результат асинхронно. Покажете как это сделать?
А про асинхронность нигде не говорилось. Это просто был пример, что отложенное перечисление в принципе возможно. Я бы и сам такой код не стал писать.

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

Всё что можно, это получить курсор и пройтись вдоль последовательности только вперёд. И надеяться, что повторный проход не отстрелит обе ноги.

Но всё это возможно сделать на IQueryable.

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

Книжка иди почитай, да. Может потом начнёшь понимать о чём речь.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807375
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttfkthatпропущено...

А про асинхронность нигде не говорилось. Это просто был пример, что отложенное перечисление в принципе возможно. Я бы и сам такой код не стал писать.

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

Всё что можно, это получить курсор и пройтись вдоль последовательности только вперёд. И надеяться, что повторный проход не отстрелит обе ноги.

Но всё это возможно сделать на IQueryable.

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

Вот, типичный пример кода, наподобии того, который у нас в репах:

Код: c#
1.
2.
3.
4.
5.
public async Task<IEnumerable<Foo>> GetFoos() {
    using(var context = new Context()) {
        return await context.Foos.ToListAsync();
    }
}
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807376
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТак какие проблемы вернуть интерфейс подходящей коллекции, если возвращаешь коллекцию? Не понимаю в упор, чего так многие упираются, в .NET целая пачка подходящих интерфейсов, все стандартизованные и поддерживаются на обоих современных платформах.

Проблема в инкапсуляции. Сегодня внутри репо список, а завтра окажется HashSet. Что, каждый раз интерфейс менять и все что его использует переписывать? Это же вообще тогда писец. А IEnumerable это и есть самая-самая базовая абстракция для всех коллекций - абстракнее некуда.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #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
Передача лямбды в репозиторий. Где ошибка?
    #39807481
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthat,
Ты пропускаешь мои аргументы.
MS рекумендует иметь по два метода. Асинхронно и синхронно. Одним не обойтись.
MS может рекомендовать хоть ссать стоя на коленях. Нам просто синхронные методы нахер не нужны, потому что все равно все контроллеры асинхронные и в итоге все через await вызывается. Рекомендация иметь пару методов это разве что для разработчиков каких-нибудь библиотек - чисто для удобства пользователя - вдруг кому надо будет синхронно вызвать. Хотя для этого достаточно всего лишь дописать к асинхронному вызову ".Result", или ".Wait". Кстати, сам МС этой рекомендации следует уже далеко не всегда - сейчас в коре уже полно апи где все вызовы только асинхронные.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807486
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatвсе контроллеры асинхронныето есть get запрос не ждет ответ?
Только не отсылай к картинке что надо освободить поток для другого запроса. Я в курсе.
...
Вы сдерали репо не быстрым но асинхронным на все все свои проекты.
А это чревато. Может потребоваться скорость, а это методы без xxxxAsync и List вместо IEnumerable.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807504
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthatвсе контроллеры асинхронныето есть get запрос не ждет ответ?

Пилять. Да разберись же ты уже в вопросе, или не спорь. Если ты десктоп пишешь, то тебе это все равно нафиг не упало. Ты про "select/poll" в юниксовых апи слышал когда-нибудь? Ну так вот, в случае операций i/o которых в веб-приложении овердофига async/await дает ту же самую выгоду. Запрос ХТТП в итоге все равно синхронен, потому что иначе быть не может, но при выполнении параллельно дофига запросов потоки используются более рационально, потому что поток, который бы в случае синхронного выполнения сидел бы и тупо ждал завершения ввода-вывода может переключиться на выполнение другого кода. В юниксах это называется "select/poll", в виндах "i/o completion port".
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807508
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЗапрос ХТТП в итоге все равно синхронен,верно.

fkthatпоток, который бы в случае синхронного выполнения сидел бы и тупо ждал завершения ввода-вывода
Теперь читай вариант решения. Без программиста:
авторПри запуске Tomcat создаст пул потоков и экземпляр сервлета. При поступлении запросов методы сервлета будут запускаться на потоках из пула. Сервлет не уничтожается до окончания работы сервера.

Потоки можно создавать самостоятельно, но зачем?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807510
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
То есть поток не сидит и не ждет, как ты описал страшилку.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807514
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123fkthat,
То есть поток не сидит и не ждет, как ты описал страшилку.

Ога. А метод твоего сервлета сел ждать запроса к БД и заблокировал поток. И нахер мне твой томкат и как там сделано, мы про asp.net говорим.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807515
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЕсли ты десктоп пишешь, то тебе это все равно нафиг не упало.
Задача повысить оклады сотрудников на 1.5.
Покажи важность асинхронности с IEnumerable против синхронности и List /Collection
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807517
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatИ нахер мне твой томкат и как там сделано, мы про asp.net говорим.ну, ты к юниксам сделал отсылку))
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807518
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatметод твоего сервлета сел ждать запроса к БД и заблокировал потоквремя запроа 0,1сек. Мало? Есть кэширование когда не из базы берет.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807522
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatНам просто синхронные методы нахер не нужныони быстрее))
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807527
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Я сливаю. Все, надоело. Ты победил.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807535
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatPetro123,

Я сливаю. Все, надоело. Ты победил.
неееет. Консенсус.
Я обязательно и твой асинхронный воткну себе))
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807537
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatPetro123пропущено...
то есть get запрос не ждет ответ?

Пилять. Да разберись же ты уже в вопросе, или не спорь.
Не трать ты на него время :)
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39807538
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЯ сливаю. Все, надоело. Ты победил.
Молоток :)
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39808168
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordя спросил, дошло-ли до тебя что проблем с множественным перечислением у IEnumerable за которые ты собирался убивать у репозиториев не будет? Или переформулировать этот вопрос в еще более простой форме?

Я уже привёл список проблем, связанных с IEnumerable. Зачем вы просите меня повторяться? Если с чем не согласны, напишите. Если непонятно, перечитайте.

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

Я не призывал что-то делать автоматически и не думая, да аргументов я до сих пор не вижу кроме того, что вы считаете IEnumerable адекватным интерфейсом. Жаль вы до сих пор не можете пояснить почему.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39808175
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatРаботает очень хорошо. Ты, походу, никак не понимаешь, что наружу там не торчит никакого ни 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 будут одни, у монговского другие и т.п. А снаружи это без разницы и с т.ч. клиента выглядит одинаково.

Я всё равно не вижу, почему не вернуть интерфейс коллекции, если никаких отложенных вычислений нет, и вы возвращаете ни что иное, как коллекции. И по семантике, и по факту.

Но вторая проблема здесь заключается в том, что такое у вас Foo? Это агрегат, сущность? Есть ли возможность получить корень агрегата полностью? Или такое поведение у вас инкапсулируется в объекте Query?

Что делать с пейджингом? Приведённый вами интерфейс в упор этого не поддерживает, даже при всём желании.

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

Это безусловно хорошо. Таким и должен быть репозиторий.


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



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

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

Сразу вопрос. Какой именно коллекции? Мне нравится Array, Васе нравится List, а Вове, так вообще HashSet. Потом, мне например, удобно внутри репо работать с массивом, я вот беру и возвращаю массив. А потом алгоритм поменялся, и стало удобно возвращать List. Что мне делать? Городить костыли внутри репо, или ломать все что снаружи? Это другая сторона инкапсуляции - не тольько спрятать что должно быть спрятано, но и иметь возможность это спрятанное поменять, не затрагивая ничего внешнего.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39808193
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatудобно внутри репо работать с массивом, я вот беру и возвращаю массивну ты прям пошутил))
Нам много не надо, свободу давай (с)
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39808493
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatСразу вопрос. Какой именно коллекции? Мне нравится Array, Васе нравится List, а Вове, так вообще HashSet.

Это не вопрос вкусов. Возвращать нужно наиболее абстрактный интерфейс, семантически отвечающий задаче, и не вызывающий проблем с производительностью и сопровождением.

IReadOnlyCollection появился в библитеке, к сожалению, слишком поздно. К тому времени многие привыкли к IEnumerable, наплевав на семантику, производительность, эффективность и сопровождение.

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


fkthatПотом, мне например, удобно внутри репо работать с массивом, я вот беру и возвращаю массив. А потом алгоритм поменялся, и стало удобно возвращать List. Что мне делать?

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


fkthatГородить костыли внутри репо, или ломать все что снаружи? Это другая сторона инкапсуляции - не тольько спрятать что должно быть спрятано, но и иметь возможность это спрятанное поменять, не затрагивая ничего внешнего.

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

Продолжим. Про пейджинг вы мне не ответили. Как оказалось, отложенные асинхронный вычисления ваши репо не поддерживают.

А что делать, если вам нужна проекция? Или огромное число проекций? Или проекции, которые на стадии разработки неизвестны? Будете периодически лазить и допиливать репо? Ох, как же это бьёт в ущерб идеи полной независимости и инкапсуляции.

IQueryable отвечает задачам и асинхронного отложенного вычисления, и возможности пейджинга, и возможности бесчисленных эффективных проекций без изменения ни строчки кода репо. На нём можно реализовать OData, например. Или кастомный протокол, выбирающий требуемые данные (конкретные поля), не вытягивая остальное. Возможность тянуть данные по связям, дааа, и фильтровать по ним. Даже фильтровать по агрегациям.

Я не к тому, что IQueryable интерфейс это лучший способ работы с данными на все времена. Не всегда он подходит. Я делал проекты на IQueryable, большие и на CQRS и c EventSourcing, и даже было дело на ActiveObject.

И могу сказать по опыту, все набросы в сторону IQueryable не стоят и выеденного яйца. Пока что из всех, кто бы реально мог аргументировать что-то против IQueryable я могу выделить skyANA, учитывая его опыт в высоконагруженном проекте.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39808500
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, это классика. Когда задача состоит в том, чтобы спроектировать и сделать автомобиль, окрылённый идеей полной инкапсуляции лепит что-то между самолётом, лодкой, автомобилем, трактором и жилым домом.

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

Возвращай что хочешь. С такими упоротыми как ты работать только один способ - во всем с ними соглашаться, и наблюдать как они сами себе могилу роют. Тем более если оценить, то, пожалуй, я за свою жизнь процентов 80 денег из заработанных мной в айти заработал за ковыряние в чужом говнокоде, т.ч. чем вас больше, тем мне лучше
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39810017
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
И массив и список и другие коллекции реализуют интерфейс IReadOnlyCollection. Только он, как интерфейс, гарантирует, что это конечный список, так как имеет свойство количества, и прямо декларирует, что он только для чтения, что означает возможность безопасно закешировать результат.


Не учи людей плохому. Он декларирует только то. что посредством него, ты ничего не сможешь добавить.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
            SortedList<int, string> keyValues = new SortedList<int, string>()
            {
                {1,"1" },
                {2,"2" }
            };

            IReadOnlyCollection<KeyValuePair<int, string>> roc = keyValues;

            Console.WriteLine(roc.Count);

            keyValues.Add(3, "3");

            Console.WriteLine(roc.Count);


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


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

Верно, что и означает read only,


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

Так полагать можно про всё что угодно, и даже про "неизменяемые" строки. Контракт означает, что он ДОЛЖЕН соблюдаться, и что этого МОЖНО ожидать. Но если как ты говоришь, не верить контракту, то далеко ты не продвинешься, по-больше try/catch, фреймворку тоже доверять нельзя. Откуда ты знаешь, что вместо открытого дескриптора файла тебе не вернут просто какое-то рандомное число? Никогда не знаешь.

Бред в общем, аргумент странный.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39812381
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Продолжим. Про пейджинг вы мне не ответили.


А чем плох, например метод GetPagedList или Page<T> FindAll(Pageable pageable) ?

hVosttА что делать, если вам нужна проекция? Или огромное число проекций? Или проекции, которые на стадии разработки неизвестны? Будете периодически лазить и допиливать репо? Ох, как же это бьёт в ущерб идеи полной независимости и инкапсуляции.
.

Как вариант, делать слегка более избыточные DTO там, где не критично. А если их огромное количество, то возможно, что статическая типизация, уже начинает больше мешать, чем помогать и нужно смотреть в сторону других контейнеров.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39812398
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0vА чем плох, например метод GetPagedListэто как?
По паре методов на каждый список? С пагинацией и без нее?
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39813137
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Бред в общем, аргумент странный.
Странно то, ReadOnly не фига не такая, а ты предлагаешь использовать ее как ReadOnly.
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39813149
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVosttБред в общем, аргумент странный.
Странно то, ReadOnly не фига не такая, а ты предлагаешь использовать ее как ReadOnly.
Всё-таки ты странный.

Есть некий класс, что возвращает IReadOnlyCollection. В данном топике обсуждается репозиторий.
Вот для потребителя (вызывающей строны) результат будет именно ReadOnly.

А то, что ты привёл в качестве примера - сродни:

- вот я вам вернул IReadOnlyCollection и потом взял и подменил содержимое, чё не ждали?!

С таким же успехом можешь базу дропнуть после того как данные на клиента вернул
...
Рейтинг: 0 / 0
Передача лямбды в репозиторий. Где ошибка?
    #39814988
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVosttБред в общем, аргумент странный.
Странно то, ReadOnly не фига не такая, а ты предлагаешь использовать ее как ReadOnly.

Если покопаешься в исходниках новых библиотек ASP.NET Core, увидишь частое использование IReadOnlyCollection, особенно там, где это семантически верно. Внутри будет либо возврат List, либо AsReadOnly. Разумеется, старые интерфейсы они вынуждены поддерживать, поэтому IEnumerable тоже используется.

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


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