GetValue LINQ 错误

Mat*_*son 1 c# linq asp.net-mvc

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

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

我现在只是在玩这个,但在某些时候我希望能够用任何列名替换“Spell_ID”文本并动态获取值。不确定我是否以正确的方式解决这个问题,但我收到以下错误:-

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

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

Fed*_*uma 5

您当前的代码使用反射来获取属性的值,但是,从我从您的异常消息中可以推断出的db是 Entity Framework DbContext

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

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

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

如果只希望一个单一的数据库实体比这更好的方法:

var entity = db.Notices.SingleOrDefault(a => a.ID == 0);
var property = entity.GetType().GetProperty("Spell_ID");
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有已知范围来查询该特定属性,则必须将整个表拉入内存?哎哟。现在肯定有更好的方法来查询这个.. (2认同)