Лучший способ написать этот запрос linq Pt2 - PullRequest
0 голосов
/ 08 июля 2011

В ответ на этот вопрос:

Лучший способ написать этот запрос linq?

Как мне построить динамический запрос, следуя тому же шаблону в этой теме?

Например, сигнатура метода меняется на:

     public List<PeopleSearchList> GetPeople(string filter, string searchType, string searchOption)
    {

        return a new List of type PeopleSearchList

    }

Так что теперь я не возвращаю ни одного массива «Имен» и т. Д. Я возвращаю пользовательский класс.

Класс будет выглядеть так:

public class PeopleSearchList
{
    public String IdentityCode { get; set; }
    public String Firstname { get; set; }
    public String Surname { get; set; }
    public Int32 LoanCount { get; set; }
    public String Group { get; set; }

}

1 Ответ

0 голосов
/ 09 июля 2011

Я разобрался.

Просто подумал, что выложу решение, чтобы другие могли его увидеть.

 public List<PeopleSearchList> GetPeople(string filter, string searchType, string searchOption)
    {
        IQueryable<Person> query = _context.People;

        PropertyInfo property = typeof (Person).GetProperty(searchType);
        MethodInfo method = typeof (string).GetMethod(searchOption, new[] {typeof (string)});

        query = query.Where(WhereExpression(property, method, filter));

        IQueryable<PeopleSearchList> resultQuery = query.Select(p => new PeopleSearchList
                                                                         {
                                                                             Firstname = p.Firstname,
                                                                             Group = p.Level.Year,
                                                                             IdentityCode = p.IdentityCode,
                                                                             LoanCount = p.Loans.Count(),
                                                                             Surname = p.Surname
                                                                         }
            ).OrderBy(p => p.Surname);

        return resultQuery.ToList();

    }

 Expression<Func<Person, bool>> WhereExpression(PropertyInfo property, MethodInfo method, string filter)
    {
        var param = Expression.Parameter(typeof(Person), "o");
        var propExpr = Expression.Property(param, property);
        var methodExpr = Expression.Call(propExpr, method, Expression.Constant(filter));
        return Expression.Lambda<Func<Person, bool>>(methodExpr, param);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...