Я только что обнаружил LINQKit и очень доволен тем, что он, кажется, обеспечивает решение общей проблемы, связанной с желанием выделить части сложных запросов linq.
Однако все примеры показывают, как исключить предикаты для предложений where.
Хотя это очень типичный вариант использования, я также хочу исключить другие виды выражений, обычно для выбора. Скажем, у меня есть следующее подвыражение:
Expression<Func<SomeFunkyEntity, String>> GetStatusFromSomeFunkyEntity()
{
return i =>
i.IsExercise ? "Excercise" :
i.IsExpired ? "Expired" :
(i.IsLocked ) ? "Locked" :
i.IsAdmitted ? "Admissible" : "Unusable";
}
Предоставляет ли LINQKit способ расширения вызова до этого? Я попытался:
var query =
from i in this.DbContext.MyFunkyEntities.AsExpandable()
select new SomeFunkyEntityWithStatus()
{
FunkyEntity = i,
Status = GetStatusFromSomeFunkyEntity().Invoke(i)
};
Это соответствует, но не работает во время выполнения в расширителе LINQKit:
Unable to cast object of type 'System.Linq.Expressions.InstanceMethodCallExpressionN' to type 'System.Linq.Expressions.LambdaExpression'.
Трассировка стека начинается с:
at LinqKit.ExpressionExpander.VisitMethodCall(MethodCallExpression m)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.ExpressionVisitor.VisitMemberAssignment(MemberAssignment assignment)
...
Это не поддерживается или я что-то не так делаю?