Использование EF для запроса неизвестного свойства во время компиляции - PullRequest
0 голосов
/ 15 марта 2012

Есть ли способ в EntityFramework (и получающемся в результате LINQ) выполнять запрос к свойству объекта, который не жестко закодирован?

Допустим, что-то, что можно использовать для функции поиска.

public IList<Entity> Search (string propertyName, object value) {

    // something that'll do the following
    return context.Set<Entity>()
        .Where(x => x.propertyName == value)
        .ToList()
        ;
}

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Вы можете построить выражение равно вручную, как это

private static Expression<Func<TEntity, bool>> BuildEqualExpression<TEntity>(string propertyName, object value)
{
    var param = Expression.Parameter(typeof(TEntity), "x");
    var body = Expression.MakeBinary(ExpressionType.Equal,
        Expression.Property(param, propertyName), Expression.Constant(value));

    return Expression.Lambda<Func<TEntity, bool>>(body, new ParameterExpression[] { param });
}

, а затем использовать его в своем запросе LINQ

var expression = BuildEqualExpression<TEntity>(propertyName, value);
return context.Set<TEntity>().Where(expression).ToList();
0 голосов
/ 15 марта 2012

Как насчет Дескриптор свойства ?

Кажется, следующий код выполняет то, что вам нужно:

string propertyName = "Length";
List<string> testList = new List<string>();

testList.Add("String1");
testList.Add("String10");
testList.Add("String100");
testList.Add("String1000");

System.ComponentModel.PropertyDescriptorCollection props = System.ComponentModel.TypeDescriptor.GetProperties(typeof(string));

System.ComponentModel.PropertyDescriptor desc = props.Find(propertyName, false);

IEnumerable<object> obj = from env in testList
             select desc.GetValue(env);

foreach (object it in obj)
{
    Console.WriteLine(it.ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...