Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GetValue LINQ错误_C#_Asp.net Mvc_Linq - Fatal编程技术网

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将项目放入内存。如果您没有查询特定属性的已知范围,您必须将整个表拉入内存?哎哟现在肯定有更好的查询方法了……如果没有已知的范围来查询特定属性,那么必须将整个表拉入内存?哎哟现在肯定有更好的方法来质疑这一点。。