c# - Applying a function within the select clause -
i have query (longish joins etc) , fields in select clause (all of of type decimal?), want return null when db has them stored 0. doing following work correctly:
var q = o in .... .... select new { ... spot = o.spot == 0 ? null : o.spot, moneyness = o.strike / (o.spot == 0 ? null : o.spot), volatility = o.rate == 0 ? null : o.rate }; but prefer encapsulate check 0 in function. tried
private static decimal? nullifzero(decimal? obj) { return obj == 0 ? null : obj; } and then
var q = o in .... .... select new { ... spot = nullifzero(o.spot), moneyness = o.strike / nullifzero(o.spot), volatility = nullifzero(o.rate) }; but error:
an unhandled exception of type 'system.invalidoperationexception' occurred in system.data.linq.dll
additional information: not translate expression 'nullifzero(<>h__transparentidentifier0.o.spot)' sql , not treat local expression.
i not error if try
var q = o in .... .... select new { ... spot = nullifzero(o.spot), moneyness = o.strike / (o.spot == 0 ? null : o.spot), volatility = nullifzero(o.rate) }; but can't see difference between nullifzero(o.spot) , (o.spot == 0 ? null : o.spot) is, when seems have effect when use divisor.
the first query fails because l2s can't translate function call nullifzero. second query works because l2s can evaluate local functions if part of last select in query. nice feature ef lacks right now.
solutions:
- inline function.
- try
asexpandablepredicate builder library.
Comments
Post a Comment