Re[15]: В России опять напишут новый объектно-ориентированны
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.03.18 07:44
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Sinclair, Вы писали:


T>>>Может и тупик, но проблема эта — не проблема ORM. Это проблема языков, которые требуют на любой чих делать отдельный класс.

S>>Нет. Это проблема — именно ORM. Потому что без ORM мы на тех же языках работаем с рекордсетами, которые не требуют порождать по классу на запрос. И прекрасно биндим их хоть в UI, хоть в бизнес-логику.

V>Это ограничения языков, где "класс" — это что-то занимающее место в релизе.

V>В компиллируемых языках типы стираются.
Дело не в бинарнике, а в объёме рукопашного кода. Если мне надо каждый select предварять отдельной декларацией public class StudentFirstAndLastName, то я умру это делать, и откажусь от проекций совсем. В классических ORM-приложениях так и делают — там принято не задумываться о том, что мы протаскиваем через игольное ушко лишние мегабайты.

В Linq ситуация чуть-чуть получше, с возможностью локально использовать анонимные классы. Но этого всё равно недостаточно для того, чтобы писать по-настоящему универсальный повторно используемый код.
Потому что я не могу написать, к примеру, функцию, которая принимает на вход "IQueryable, параметризованный любым типом с FirstName и LastName", и возвращающую "IQueryable, параметризованный типом с теми же свойствами, что и у аргумента, плюс string FullName".
Хотя уже можно делать штуки типа
IQueryable<T> FilterByDateRange(this IQueryable<T> input, Expression<Func<T, DateTimeOffsetDate>> dateSelector DateTimeOffset? from, DateTimeOffset? to)
{
  var query = input;
  if(from.HasValue)
    query = from q in query where dateSelector(q) >= @from.Value select q;
  if(to.HasValue)
    query = from q in query where dateSelector(q) >= to.Value select q;
  return q; 
}

И не велосипедить однообразные ветки if в "прикладных" функциях:
IQueryable<Order> DisplayOrders(DateTimeOffset? payDateFrom, DateTimeOffset? payDateto, DateTimeOffset? deliverDateFrom, DateTimeOffset? deliverDateTo, ...)
{
   return DB.Orders
        .FilterByDateRange(o=>o.PayDate, payDateFrom, payDateTo)
        .FilterByDateRange(o=>o.DeliverDate, deliverDateFrom, deliverDateTo)
        ...
;
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.