类型为“System.DateTime”的表达式不能用于返回类型“System.Object”

Kation 2013-01-14 10:31:16
Linq
var parameter = Expression.Parameter(typeof(TEntity), "t");
var express = Expression.Lambda<Func<TEntity, object>>(Expression.Property(parameter, property), parameter);

出现错误
类型为“System.DateTime”的表达式不能用于返回类型“System.Object”
property是TEntity中的某个属性
当property不是值类型,比如string类型的时候
就不出错
但是当property是值类型,比如DateTime类型的时候就出错了
因为这个属性是根据属性名动态指定的
所以在Func<TEntity, ?? >这里,只有填object才行

后面需要用到OrderBy(express)

如何解决?
...全文
447 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeagen 2013-05-17
  • 打赏
  • 举报
回复
我的解决方法是在调用的时候写:a=>new {a.Datetime}来取代 a=>a.Datetime,就不会报这个错
Kation 2013-01-15
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
你直接写 Expression<Func<SomeType, object>> express = x => x.Time; 可以运行么? 如果这个都不行,那就没辙。
x里面的属性是显示不出来的,相当于object 我现在找到了个方法,但是好麻烦,你看能不能优化下?
var parameter = Expression.Parameter(typeof(TEntity), "t");
IOrderedQueryable<TEntity> result;
var express = Expression.Lambda(typeof(Func<,>).MakeGenericType(typeof(TEntity), property.PropertyType), Expression.Property(parameter, property), parameter);
if (displayColumn.SortDescending)
{
    var method = typeof(Queryable).GetMethods().Where(t => t.Name == "OrderByDescending").ElementAt(0).MakeGenericMethod(typeof(TEntity), property.PropertyType);
    result = (IOrderedQueryable<TEntity>)method.Invoke(DbSet, new object[] { DbSet, express });
}
else
{
    var method = typeof(Queryable).GetMethods().Where(t => t.Name == "OrderBy").ElementAt(0).MakeGenericMethod(typeof(TEntity), property.PropertyType);
    result = (IOrderedQueryable<TEntity>)method.Invoke(DbSet, new object[] { DbSet, express });
}
DbSet就是DbSet<TEntity>的实例名。
threenewbee 2013-01-15
  • 打赏
  • 举报
回复
你直接写 Expression<Func<SomeType, object>> express = x => x.Time; 可以运行么? 如果这个都不行,那就没辙。
Kation 2013-01-15
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
var parameter = Expression.Parameter(typeof(TEntity), "t"); var express = Expression.Lambda<Func<TEntity, object>>(Expression.Convert(Expression.Property(parameter, property), typeof(obj……
Unable to cast the type 'System.XXX' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types. EF貌似不能在Lambda里用转换。。。
threenewbee 2013-01-15
  • 打赏
  • 举报
回复
var parameter = Expression.Parameter(typeof(TEntity), "t"); var express = Expression.Lambda<Func<TEntity, object>>(Expression.Convert(Expression.Property(parameter, property), typeof(object)), parameter);
Kation 2013-01-14
  • 打赏
  • 举报
回复
引用 1 楼 claspcn 的回复:
DateTime不是类,看文档我们就可以知道,它是struct结构,不是class类,所以它是值类型
改object为ValueType也不行
相信的勇气 2013-01-14
  • 打赏
  • 举报
回复
DateTime不是类,看文档我们就可以知道,它是struct结构,不是class类,所以它是值类型

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧