IQueryable <object>Выражение LINQ бросило System.Object для ввода «Анонимный тип» - PullRequest
0 голосов
/ 15 февраля 2020

Я написал запрос linq, чтобы получить данные и сохранить их в IQueryable<object>. После этого я хочу выполнить выражение Linq, чтобы удалить некоторые нулевые данные.

  IQueryable<object> employees;

    select new
         {
              temp.EMP_NO,
              personal.EMP_NAME,
              hptrx.TRX_CD,
              trx.TRX_DESC,
              CURRENT_MONTH = hptrx.AMOUNT,
              PREVIOUS_MONTH = db.HPTRXes.Where(x => x.COMP_CD == temp.COMP_CD && x.EMP_NO == temp.EMP_NO && 
                               x.TRX_CD == hptrx.TRX_CD && x.P_MTH == previousMonth && x.P_YEAR == 
                               previousYear && x.P_PERIOD == record.P_PERIOD).Select(x => x.AMOUNT).FirstOrDefault()
         });

Ниже будет выполнен код для фильтрации PREVIOUS_MONTH содержит нулевое значение.

 var propertyPreviousMonth = "PREVIOUS_MONTH";
 var sourceType = typeof(object);
 var underlyingType = employees.First().GetType();
 var propertyType = underlyingType.GetProperty(propertyPreviousMonth).PropertyType;
 var param = Expression.Parameter(sourceType);

 var left = Expression.Property(
      Expression.Convert(param, underlyingType), propertyPreviousMonth
 );
 Expression right = Expression.Constant(null);
 Expression e1 = Expression.NotEqual(left, right);
 var lambda = Expression.Lambda(e1, param);

 var expr = Expression.Call(typeof(Queryable), "Where", new Type[] { sourceType },
     employees.Expression, lambda
 );
 employees = employees.Provider.CreateQuery<object>(expr);

Однако я получаю ошибка ниже при вызове employees.Count()

Невозможно привести тип «System.Object» к типу «Анонимный тип». LINQ to Entities поддерживает только приведение типов примитивов и перечислений EDM.

1 Ответ

1 голос
/ 15 февраля 2020

Просто предложение, вы можете попробовать:

let prevMonth = db.HPTRXes.Where(x => x.COMP_CD == temp.COMP_CD && x.EMP_NO == temp.EMP_NO && 
                           x.TRX_CD == hptrx.TRX_CD && x.P_MTH == previousMonth && x.P_YEAR == 
                           previousYear && x.P_PERIOD == record.P_PERIOD).FirstOrDefault()
where prevMonth != null
select new
     {
          temp.EMP_NO,
          personal.EMP_NAME,
          hptrx.TRX_CD,
          trx.TRX_DESC,
          CURRENT_MONTH = hptrx.AMOUNT,
          PREVIOUS_MONTH = prevMonth.AMOUNT
     });
...