【问题标题】:LINQ creating anonymous type array errorLINQ 创建匿名类型数组错误
【发布时间】:2013-01-17 17:34:04
【问题描述】:

我正在尝试使用 LINQ 从结果集中创建一个匿名类型的数组。

我的代码是

var data = (from s in sortedStudents
            select new
            {
                //id = s.CurrencyId,
                cell = new object[] { s.PropertyNumber.ToString(), s.Name,
                s.Status.ToString(), "Hello" }
            }).ToArray();

但我收到如下错误,但我没有使用任何 System.Int64 变量。

无法将类型“System.Int64”转换为类型“System.Object”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

任何想法这里有什么问题。

花了一段时间后,我怀疑我对数据进行排序的逻辑造成了问题,我对日期进行排序的代码是

// Utility method to sort IQueryable given a field name as "string"
    // May consider to put in a cental place to be shared
    public IQueryable<T> SortIQueryable<T>(IQueryable<T> data, string fieldName, string sortOrder)
    {
        if (string.IsNullOrWhiteSpace(fieldName)) return data;
        if (string.IsNullOrWhiteSpace(sortOrder)) return data;

        var param = Expression.Parameter(typeof(T), "i");
        Expression conversion = Expression.Convert(Expression.Property(param, fieldName), typeof(object));
        var mySortExpression = Expression.Lambda<Func<T, object>>(conversion, param);

        return (sortOrder == "desc") ? data.OrderByDescending(mySortExpression)
            : data.OrderBy(mySortExpression);
    }

现在,当我的列名类型为 system.int64 时,它的创建问题是,当我对结果执行 .ToArray 时,实际上会执行查询。

【问题讨论】:

  • 为什么cell 不是string[]?所有条目似乎都是字符串。
  • cell 是 object[] 因为它也将包含 Id,现在所有值字符串,因为我试图找出哪一列造成了问题。

标签: c# linq sorting anonymous-types


【解决方案1】:

问题可能出在您的排序逻辑中,即这一行:

Expression conversion = Expression.Convert(Expression.Property(param, fieldName), typeof(object));

如错误消息所述,LINQ to Entities 不支持这种类型的转换。您需要事先使用.ToList() 执行查询,或者重新制定排序逻辑。

【讨论】:

  • 我同意这个声明中存在问题,但有什么解决方案?
  • 在调用SortIQueryable 方法之前,请尝试使用.ToList().AsEnumerable() 评估现有表达式。这将对所有进一步的表达式使用 LINQ to Objects。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2016-01-30
  • 2011-11-07
  • 2012-04-05
相关资源
最近更新 更多