【问题标题】:Generic Repository Method throws conversion error通用存储库方法引发转换错误
【发布时间】:2013-03-19 05:50:10
【问题描述】:

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

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

【问题讨论】:

  • d.Grupo是什么类型?

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


【解决方案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);
}

问题是OrderBy 子句中Func 的第二个参数在您的代码中是object,并且您将其传递给int,然后它会尝试将int 转换为@ 987654327@。在我上面粘贴的代码中,您有一个额外的通用参数,它允许您为排序函数传递任何类型,所以应该可以。

【讨论】:

  • @amhed:抱歉,打错了,您需要将泛型参数添加到方法定义中,例如 SellectAll&lt;TE, TKey&gt; 并从 IQueryable 中删除 TKey。我编辑了我的帖子。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2018-03-19
相关资源
最近更新 更多