|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Разбираю 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.
В контроллере идет вызов: Код: c# 1.
При этом формируется SQL: Код: sql 1. 2. 3.
Но если я переписываю репозиторий (): Код: c# 1. 2. 3. 4. 5. 6.
[то получаю вполне ожидаемый код, который ведет отбор на сервере базы данных: Код: sql 1. 2. 3.
При этом результаты вывода - одинаковые. Почему передача лямбды в репозиторий приводит к фильтрации строк на стороне EF а не SQL? Где я ошибаюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 06:52 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Maksimka-27, Скорее всего проблема в отложенном выполнении, реальное преобразование в запрос происходит на момент вычисления всей цепочки, ваш внешний func не может заинжектиться корректно, что логично. Надо смотреть в доке как разбирается Linq ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 08:25 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
пробуй Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 08:58 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Shocker.Pro, Помогло, Спасибо!!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 10:03 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Maksimka-27Разбираю Pro Entity Framework Core 2 for ASP.NET Core MVC замечательного автора Adam Freeman.хмм... А MS со своим кодом ниже в пику ему делает свои справки и демки? dotnet ef dbcontext scaffold xxxxxxxxxx И получаем вместо репозитория класс XXXContext.cs ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 10:53 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Фримен упирает на модульное тестирование, поэтому интерфейс для репозитория в примере - вполне в его стиле. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 10:56 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Shocker.Pro, Спс. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 11:02 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Shocker.Proпробуй Код: c# 1.
+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 11:46 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Maksimka-27 Код: c# 1.
IQueryable ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 12:41 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
hVosttMaksimka-27 Код: c# 1.
IQueryableтогда .ToList(); будет лишним? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 12:58 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Petro123.ToList(); будет лишним? делать ToList() и возвращать IEnumerable сродни тому, как плюнуть в лицо :) хотя бы ICollection, хотя желательно IReadOnlyCollection касательно озвученной проблемы, правильно решается с помощью паттерна спецификаций, например: https://enterprisecraftsmanship.com/2016/02/08/specification-pattern-c-implementation/ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 14:14 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
hVosttделать ToList() и возвращать IEnumerable сродни тому, как плюнуть в лицо :)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 15:02 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
hVosttделать ToList() и возвращать IEnumerable сродни тому, как плюнуть в лицо :)Кстати, слышал как-то формулу - параметр метода должен быть максимально абстрактного типа, результат - максимально конкретного. Скажи, гуру, ты согласен с этой формулой? То есть, в данном случае, вернуть прямо таки List<>. Если потребителю нужен ICollection - он сам выполнит приведение. А может ему понадобится непосредственно функционал листа. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 15:07 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Shocker.ProЕсли потребителю нужен ICollection - он сам выполнит приведение.с этим не согласен. Возвращать нужно то что просят выше. Чтобы 200 вызовов не приводить и кода не добавлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 15:13 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Shocker.ProКстати, слышал как-то формулу - параметр метода должен быть максимально абстрактного типа, результат - максимально конкретного. Скажи, гуру, ты согласен с этой формулой? Главное не путать абстракцию с семантикой. IEnumerable -- это бесконечная последовательность, в качестве которой может выступать как коллекция, так и генератор, поэтому он не является абстракцией коллекции. самая максимальная абстракция коллекции в C# это IReadOnlyCollection. Shocker.ProТо есть, в данном случае, вернуть прямо таки List<>. Ни в коем случае. List это реализация. Вообще самые злостные крайности джунов это возвращать IEnumerable, или List. Ругаю очень за такое. Shocker.ProЕсли потребителю нужен ICollection - он сам выполнит приведение. А может ему понадобится непосредственно функционал листа. Я говорю конкретно про контракты. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 23:59 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
hVosttНи в коем случае. List это реализация. Вообще самые злостные крайности джунов это возвращать IEnumerable, или List. Ругаю очень за такое.не понял. Я налево и направо возвращаю. А что делать, если наверху правят эту коллекцию? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 07:48 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Petro123hVosttНи в коем случае. List это реализация. Вообще самые злостные крайности джунов это возвращать IEnumerable, или List. Ругаю очень за такое.не понял. Я налево и направо возвращаю. А что делать, если наверху правят эту коллекцию? надо вернуть метаданные - адрес памяти, длина блока памяти а там пусть как хотят так и интерпретируют а то всякие там коллекции и т.д. не кошерны ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 09:52 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
ViPRosнадо вернуть метаданные - адрес памяти, длина блока памятив Net есть Pointer или *p ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 10:12 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
Petro123не понял. Я налево и направо возвращаю. А что делать, если наверху правят эту коллекцию? если коллекция может правиться, то ICollection. если к этому нужен индексированный доступ, то IList. контракты должны быть максимально абстрактными, но не нарушать семантику. а то можно вообще везде object возвращать, чё мелочиться-то? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 11:35 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
hVosttIQueryable руки отрубать за такое надо. Логика запросов расползется по всем слоям убив поддерживаемость и производительность ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 12:59 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
stenfordhVosttIQueryable руки отрубать за такое надо. Логика запросов расползется по всем слоям убив поддерживаемость и производительность серьёзно? за много лет мне ещё никто не доказал и не показал, что там "убивается" в поддержке и производительности IQueryable это абстрактный контракт слоя работы с данными. ни чем не отличается от +100500 других костылей и способов, просто у отдельных людей откуда-то возникает панический страх, который они не могут ни понять, ни объяснять. работай со слоем доступа к данным из слоя логики, не тащи на клиентский слой, в чём проблемы? это прям когнитивный диссонанс. видишь как человек боится юзать IQueryable, потом смотришь а он там прокидывает IEnumerable или вообще List -- дабл фейспалм. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 13:06 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
hVosttсерьёзно? за много лет мне ещё никто не доказал и не показал, что там "убивается" в поддержке и производительности IQueryable это абстрактный контракт слоя работы с данными. ни чем не отличается от +100500 других костылей и способов, просто у отдельных людей откуда-то возникает панический страх, который они не могут ни понять, ни объяснять. работай со слоем доступа к данным из слоя логики, не тащи на клиентский слой, в чём проблемы? это прям когнитивный диссонанс. видишь как человек боится юзать IQueryable, потом смотришь а он там прокидывает IEnumerable или вообще List -- дабл фейспалм. то, что ты чего-то там в своей жизни не видел не влияет на то, как эти вещи работают, если у тебя создан репозиторий - то логика запросов должна содержаться в нем по указанным выше причинам, в простых случаях он не нужен и никто не мешает работать с базой из слоя логики, а кашу и репозитория и логики запросов в нескольких слоях лепят только студенты на первых годах своей работы пока не поднаберутся опыта ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 13:32 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
stenfordто, что ты чего-то там в своей жизни не видел не влияет на то, как эти вещи работают, если у тебя создан репозиторий - то логика запросов должна содержаться в нем по указанным выше причинам, в простых случаях он не нужен и никто не мешает работать с базой из слоя логики, а кашу и репозитория и логики запросов в нескольких слоях лепят только студенты на первых годах своей работы пока не поднаберутся опыта абосолютно ни о чём. IQueryable это абстракция. ни чем не хуже любых созданных вами кривых поделок, и не надо тут залечивать про кашу, не умеете -- не варите. про репозитории вида god queries object уже писалось не раз, обсуждалось. то, что вы слыхом про это не слыхивали, проблемы только ваши. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:40 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
stenfordна первых годах своей работы пока не поднаберутся опыта как я вижу, многим и десятки лет опыта ничего не дают. как лепят свои унылые поделки, которые освоили на студенческих примерах, так и продолжают лепить до посинения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:41 |
|
Передача лямбды в репозиторий. Где ошибка?
|
|||
---|---|---|---|
#18+
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.
В контроллере идет вызов: Код: c# 1.
При этом формируется SQL: Код: sql 1. 2. 3.
Но если я переписываю репозиторий (): Код: c# 1. 2. 3. 4. 5. 6.
[то получаю вполне ожидаемый код, который ведет отбор на сервере базы данных: Код: sql 1. 2. 3.
При этом результаты вывода - одинаковые. Почему передача лямбды в репозиторий приводит к фильтрации строк на стороне EF а не SQL? Где я ошибаюсь? а нафига вообще такой репозиторий? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2019, 19:12 |
|
|
start [/forum/topic.php?fid=17&fpage=3&tid=1349125]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 243ms |
total: | 375ms |
0 / 0 |