通用存储库方法会引发转换错误

时间:2013-03-18 16:30:01

标签: c# asp.net-mvc entity-framework

我有以下存储库方法,它应用过滤器然后对集合进行排序:

  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);
        }

where谓词工作正常,但是如果应用OrderBy,我们会收到以下错误:

无法将类型'System.Int32'强制转换为'System.Object'。 LINQ to Entities仅支持转换EDM原语或枚举类型。

编辑:这是调用代码:

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

1 个答案:

答案 0 :(得分: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);
}

问题是代码中Func子句中的OrderBy的第二个参数是object,而你传递的是int,然后尝试将int投射到object。在我上面粘贴的代码中,你有一个额外的泛型参数,允许你传递任何类型的订购函数,所以,这应该工作。