Динамический LINQ с объектами данных - PullRequest
3 голосов
/ 27 октября 2010

Итак, я искал простой пример, надеюсь, простой проблемы.

У меня есть простой объект Список ListTest (Список)

public class ListTest{
{
    public string perName { get; set; }
    public string perSex { get; set; }
    public ListTest(string pName, string pSex)
    {
        this.perSex = pSex;
        this.perName = pName;
    }
}

Я загрузил его с некоторыми данными:

        List<ListTest> tryIt = new List<ListTest>();
        tryIt.Add(new ListTest("Karen", "F"));
        tryIt.Add(new ListTest("Kate", "F"));
        tryIt.Add(new ListTest("Glen", "M"));
        tryIt.Add(new ListTest("Tiger", "M"));
        tryIt.Add(new ListTest("Clementine", "F"));
        tryIt.Add(new ListTest("Magnolia", "F"));

Теперь я хочу запросить его, используя лямбда-выражение:

        var things = tryIt
                     .Where(sex => (sex.perSex == "F"))
                     .OrderBy(sex => sex.perName);

Но я хочу сделать это динамически, на тот случай, если я захочу изменить свое местоположение на «perName».

Я могу создать лямбда-выражение для ваших выражений, но не могу понять, как перенести его через линию ворот, назначить его предложению where и выполнить его.

        IQueryable<ListTest> iq = tryIt.AsQueryable();
        ParameterExpression pe = Expression.Parameter(typeof(ListTest), "Person");
        Expression paEx = Expression.Property(pe, "perSex");
        Expression right = Expression.Constant("F");
        Expression eqEx = Expression.Equal(paEx, right);
        Expression lE = Expression.Lambda<Func<ListTest, bool>>(eqEx, pe);

Это должно быть простое решение из 4 или 5 строк, но я не могу найти пример легко дешифруемого решения.

Должен ли я использовать MethodCallExpression или что-то в этом роде?

Спасибо

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Вы можете попробовать что-то вроде этого:

IEnumerable<ListTest> things = tryIt;

if (someBooleanLogic)
    things = things.Where(l => l.perSex == "F");
else
    things = things.Where(l => l.perName == "Tiger");

things = things.OrderBy(sex => sex.perName);

List<ListTest> filteredAndSorted = things.ToList();

Редактировать:

Или есть также популярная библиотека динамических запросов LINQ ,где вы можете сформировать свой запрос практически так, как хотите (динамически, конечно).

0 голосов
/ 30 октября 2010

Я нашел самое элегантное решение в этой публикации .Это позволило мне построить очень гибкое и понятное решение, не попадая в ад параметров.

...