2013-08-14 2 views
1

У меня есть такой класс:Переходя выражение в лямбда

public class SomeClass 
{ 
    public string Text1 { get; set; } 

    public string Text2 { get; set; } 

    public int Number { get; set; } 
} 

И у меня есть список этих классов объектов:

List<SomeClass> myList = new List<SomeClass>(); 

Я хочу, чтобы запросить этот список с помощью LINQ (лямбда-синтаксис):

var result = myList.Where(obj => obj.Text1 == "SomeString"); 

Есть ли способ передать свойство (например, по имени строки), по которому я хочу выполнить этот запрос LINQ? В этом примере я выполняю поиск по свойству Text1, но предположим, что хочу динамически вызывать этот поиск в Text1 или Text2 (определенный во время выполнения). Я хочу, чтобы иметь возможность передать имя свойства, в котором выполняется этот поиск, и проверить, является ли это свойство строкой, так что я уверен, что этот поиск МОЖЕТ быть выполнен в первую очередь.

Возможно ли это? Я знаю, что «Размышления и выражения» имеют к этому какое-то отношение, но я их не очень хорошо знаю.

Благодаря

+0

Вы не можете передавать динамические параметры по умолчанию с помощью LINQ, но есть библиотеки, которые можно использовать для достижения этой цели. –

ответ

1

Подход с помощью отражения:

var result = myList.Where(obj => obj.GetType() 
            .GetProperty("Text1") 
            .GetValue(obj) 
            .Equals("SomeString")); 

С таким образом, вы можете изменить от "Text1" к "Text2" собственности.

Другой подход можно использовать dynamic linq:

var result = myList.AsQueryable().Where("[email protected]", "SomeString"); 

Dynamic LINQ также доступна через nuget.

+1

Подход рефлексии идеально подходит для меня, спасибо брату. –

1

Можно использовать деревья выражений?

string memberName = "Text1", value = "SomeString"; 
var p = Expression.Parameter(typeof(SomeClass), "obj"); 
var predicate = Expression.Lambda<Func<SomeClass, bool>>(
    Expression.Equal(
     Expression.PropertyOrField(p, memberName), 
     Expression.Constant(value,typeof(string)) 
    ), p); 
var result = myList.AsQueryable().Where(predicate); 

или альтернатива для последней строки:

var result = myList.Where(predicate.Compile()); 
Смежные вопросы