Как отразить свойство лямбда в общем методе? - PullRequest
2 голосов
/ 25 ноября 2011

Мне нужно отразить свойство для лямбды для моего репозитория, вот код:

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");
    }
}

но результат лямбды - пустой список ... Помогите пожалуйста, что я делаю не так?

1 Ответ

2 голосов
/ 25 ноября 2011

В вашем запросе 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();
...