C# GetValue LINQ错误
我尝试使用以下代码将实体的特定属性的值检索到变量中C# GetValue LINQ错误,c#,asp.net-mvc,linq,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 Enti
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 GetValueSystem.Object”方法,此方法无法转换为存储表达式
我知道我这样做的方式不对,而且我对C MVC/LINQ比较陌生,但我花了太多时间来修补代码,我迷路了……有人能给我指出正确的方向吗?您当前的代码使用反射来获取属性的值,但是,从您的异常消息中我可以推断,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");
您当前的代码使用反射来获取属性的值,但是,从异常消息中可以推断,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");
不是开玩笑,而是错误 LINQ to Entities无法识别“System.Object GetValueSystem.Object”方法,此方法无法转换为存储表达式 这正是它听起来的样子。LINQ无法将GetValue方法转换为实体框架确切执行的任何操作
虽然有方法让EF和LINQ识别方法,但这有点痛苦。最快的解决办法是只使用一个循环。不是开玩笑,而是错误 LINQ to Entities无法识别“System.Object GetValueSystem.Object”方法,此方法无法转换为存储表达式 这正是它听起来的样子。LINQ无法将GetValue方法转换为实体框架确切执行的任何操作
虽然有方法让EF和LINQ识别方法,但这有点痛苦。最快的解决方案是只使用循环。EntityFramework无法在服务器上执行循环,因为它必须转换为SQL查询。您必须在Where子句之后调用ToList,并对返回的值进行反射。难道您不能。。。调用属性本身。Selectx=>x.Spell\u ID?问题是SQL不知道任何反射。因此,当您的代码被翻译成SQL时,编译器应该为反射内容推断什么?正如stuartd提到的,为了进行反射,您需要使用ToList将项目放入内存。EntityFramework无法在服务器上执行该操作,因为它必须转换为SQL查询。您必须在Where子句之后调用ToList,并对返回的值进行反射。难道您不能。。。调用属性本身。Selectx=>x.Spell\u ID?问题是SQL不知道任何反射。因此,当您的代码被翻译成SQL时,编译器应该为反射内容推断什么?正如stuartd提到的,为了进行反射,您需要使用ToList将项目放入内存。如果您没有查询特定属性的已知范围,您必须将整个表拉入内存?哎哟现在肯定有更好的查询方法了……如果没有已知的范围来查询特定属性,那么必须将整个表拉入内存?哎哟现在肯定有更好的方法来质疑这一点。。