2013-03-18 41 views
1

我有应用滤镜,然后将以下资料库的方法顺序集合:通用库方法引发转换错误

public IQueryable<TE> SelectAll(Expression<Func<TE, bool>> predicate, 
      Expression<Func<TE, object>> sortExpression, bool orderDescending = false) 
     { 
      var list = _ctx.CreateQuery<TE>("[" + typeof(TE).Name + "]") 
       .AsExpandable().Where(predicate); 

      return orderDescending 
       ? list.OrderByDescending(sortExpression) 
       : list.OrderBy(sortExpression); 
     } 

的地方谓语工作正常,但是当如果应用排序依据,我们得到以下错误:

无法将类型'System.Int32'转换为键入'System.Object'。 LINQ to Entities仅支持投射EDM基元或枚举类型。

编辑:这是调用代码:

var documentos = SelectAll(d => serviciosId.Contains(d.ServicioId) && d.TipoSociedadId == tipoSociedadId, d => d.Grupo); 
+0

'd.Grupo'是什么类型? – ecampver 2013-03-18 18:37:43

+0

@ e.campver Int32 – amhed 2013-03-18 19:53:37

回答

1

试试这个:

public IQueryable<TE> SelectAll<TE, TKey>(Expression<Func<TE, bool>> predicate, 
      Expression<Func<TE, TKey>> sortExpression, bool orderDescending = false) 
{ 
    var list = _ctx.CreateQuery<TE>("[" + typeof(TE).Name + "]") 
        .AsExpandable().Where(predicate); 

    return orderDescending 
     ? list.OrderByDescending(sortExpression) 
     : list.OrderBy(sortExpression); 
} 

的问题是FuncOrderBy子句中的第二个参数是在你的代码object,并且您传递它int,然后它会尝试将该int转换为object。在上面粘贴的代码中,您有一个额外的通用参数,它允许您为订购功能传递任何类型的参数,所以应该可以工作。

+0

我得到一个编译错误(无法解析符号TKey) – amhed 2013-03-18 21:38:18

+0

@amhed:对不起,这是一个错字,您需要将通用参数添加到方法定义中,类似于'SellectAll ',并删除'IQueryable'中的'TKey'。我编辑了我的帖子。 – ecampver 2013-03-18 21:50:26

+0

明白了!谢谢! – amhed 2013-03-18 22:05:57

相关问题