GetValue LINQ错误

时间:2017-05-17 14:41:43

标签: c# asp.net-mvc linq

我正在尝试使用以下代码将实体的特定属性的值检索到变量中。

var item = db.Notices
  .Where(a => a.ID == 0)
  .Select(x => x
     .GetType()
     .GetProperty("Spell_ID")
     .GetValue(x));

我现在正在玩这个,但在某些时候我希望能够用任何列名替换'Spell_ID'文本并动态获取值。不确定我是否正确地走这条路,但我收到以下错误: -

LINQ to Entities无法识别方法'System.Object GetValue(System.Object)'方法,并且此方法无法转换为商店表达式。

我知道我没有以正确的方式做到这一点(而且我对C#MVC / LINQ相对较新),但我花了很多时间修补我迷失方向的代码......可以有人指出我正确的方向吗?

2 个答案:

答案 0 :(得分:4)

您当前的代码使用反射来获取属性的值,但是,根据我从您的异常消息中推断出的内容,db是一个实体框架DbContext

实体框架根本不支持反射,因为您的LINQ查询随后会被框架本身转换为SQL查询。因此,如果您确实需要获得单一属性,则必须更改方法:

var items = db.Notices.Where(a => a.ID == 0).ToList();
var itemsProperty = items.Select(x => x.GetType().GetProperty("Spell_ID"));

这将从数据库中获取所有资源,然后在内存中执行Select部分。

如果您希望数据库中只有单个实体,那么这是一种更好的方法:

var entity = db.Notices.SingleOrDefault(a => a.ID == 0);
var property = entity.GetType().GetProperty("Spell_ID");

答案 1 :(得分:0)

不要吝啬,但错误

LINQ to Entities无法识别方法' System.Object GetValue(System.Object)'方法,此方法无法转换为商店表达式。

听起来就像是这样。 LINQ无法将GetValue()方法转换为Entity Framework完全正确执行的操作。

虽然有办法让EF和LINQ识别方法,但它有点痛苦。最快的解决方案是使用循环。