Здравствуйте, 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)
...
;
}