Я создаю вспомогательный метод, который возвращает выражение, основанное на свойстве, которое может использоваться в orderby или где и т. Д. В операции linq для сущностей.Невозможно построить lambda Выражение с неизвестным типом свойства
Я не буду знать тип свойства upfront, поэтому я объявил его как объект и динамический, а также попытался использовать Expression.Convert
, но он не будет работать для свойств, отличных от строковых.
Тип тока свойство, которое не является строкой, что я работаю с это int?
и ошибка, я получаю
Выражение типа «System.Nullable`1 [System.Int32]» не может быть используется для типа возврата 'System.Object';
Код:
var param = Expression.Parameter(typeof(Employee), "x");
MemberExpression propExp = Expression.Property(param, "somePropertyName");
Expression.Lambda<Func<Employee, object>>(propExpression, param);
Как я уже сказал, я использовал объект и динамика в строке выше с теми же результатами. Я также попытался преобразовать его в правильный тип, но это не работает:
Expression conversion = Expression.Convert(propExp, ((PropertyInfo)propExp.Member).PropertyType)
В то время как я нахожусь в режиме отладки, и я стараюсь это, Expression.Lambda(conversiona, param)
, кажется, работает
{x => Convert(x.EmployeeNo)}
Body: {Convert(x.EmployeeNo)}
CanReduce: false
DebugView: ".Lambda #Lambda1<System.Func`2[xx.DomainModel.Entities.Employee,System.Nullable`1[System.Int32]]>(xx.DomainModel.Entities.Employee $x)\r\n{\r\n (System.Nullable`1[System.Int32])$x.EmployeeNo\r\n}"
Name: null
NodeType: Lambda
Parameters: Count = 1
ReturnType: {Name = "Nullable`1" FullName = "System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}
TailCall: false
Type: {Name = "Func`2" FullName = "System.Func`2[[xx.DomainModel.Entities.Employee, Fng.Facts.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}
... но когда я использую его в OrderBy я получаю CS1503
ошибки: Аргумент 2: не может конвертировать из «System.Linq.Expressions.LambdaExpression» в «строка»
Я подумал, что, может быть, мне нужно динамически строить Expression.Lambda с помощью правильного типа, как я проверить его, но не пробовал, что еще
Спасибо за любую помощь
Вместо того, чтобы пытаться построить выражение, попробуйте создать целую 'OrderBy (Descending)'/'ThenBy (Descending)' call. В противном случае у вас будет такая же проблема, как в [Как указать тип предиката, который я не буду знать до выполнения?] (Http://stackoverflow.com/questions/40544393/how-can-i-specify- a-predicates-type-which-i-wont-know-until-runtime/40545008 # comment68329807_40545008) –
Возможный дубликат [Как использовать строку для создания EF-заказа по выражению?] (http://stackoverflow.com/ Вопросы/39908403/how-to-use-a-string-to-create-a-ef-order-by-expression) –