我需要为我的Repository反映lambda的属性,这里是代码:
public abstract class RestController<T> : Controller where T : class
{
private readonly IRepository _db;
private readonly string _identityProp;
protected RestController(IRepository db, string identityProp)
{
_db=db;
_identityProp = identityProp;
}
protected virtual void Delete(T item)
{
var value = item.GetType().GetProperty(_identityProp).GetValue(item, null);
var items = _db.All<T>()
.Where(i=>i.GetType().GetProperty(_identityProp)==val)
.ToList();
items.ForEach(x=>_db.Delete(x));
_db.CommitChanges();
return Json("success");
}
}
但lambda的结果是一个空列表...请帮助,我做错了什么?
答案 0 :(得分:2)
您在LINQ查询中缺少.GetValue(i, null)
。目前,您正在将属性(value
)的值与描述该属性的PropertyInfo
进行比较。
正确的代码:
var items = _db.All<T>()
.Where(i => i.GetType().GetProperty(_identityProp)
.GetValue(i, null) == val)
.ToList();
或者,更多以性能为导向:
var propertyInfo = item.GetType().GetProperty(_identityProp);
var value = propertyInfo.GetValue(item, null);
var items = _db.All<T>()
.Where(i => propertyInfo.GetValue(i, null) == val)
.ToList();