| 
 | 
| 
 
Передача лямбды в репозиторий. Где ошибка? 
 | 
|||
|---|---|---|---|
| 
 #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&msg=39799068&tid=1349125]:  | 
    0ms | 
get settings:  | 
    9ms | 
get forum list:  | 
    13ms | 
check forum access:  | 
    4ms | 
check topic access:  | 
    4ms | 
track hit:  | 
    66ms | 
get topic data:  | 
    11ms | 
get forum data:  | 
    2ms | 
get page messages:  | 
    55ms | 
get tp. blocked users:  | 
    1ms | 
| others: | 14ms | 
| total: | 179ms | 

| 0 / 0 | 

    Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
    
    
    «На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
    
    
    ... ля, ля, ля ...