Дерево выражений как часть свойства - PullRequest
1 голос
/ 11 февраля 2012

Я черпаю вдохновение в этом вопросе:

Преобразование выражения Linq в Sql в дерево выражений

Автор оригинала спросил, как преобразовать это в дерево выражений, и получил хороший ответ, который можно увидеть по ссылке выше.

List<Region> lst = (from r in dc.Regions
                    where r.RegionID > 2 && r.RegionDescription.Contains("ern")
                    select r).ToList();

Как бы я смог создать свойство с помощью метода get, который возвращает bool, использующий ExpressionTree? Я хотел бы иметь возможность сделать что-то вроде этого (очевидно, мне не нужно == true):

List<Region> lst = (from r in dc.Regions
                    where (r.AwesomeProperty == true)
                    select r).ToList();

Как бы я определил AwesomeProperty?

1 Ответ

1 голос
/ 11 февраля 2012

Вы бы определили AwesomeProperty точно так же, как любое другое свойство в вашем объекте LINQ to SQL. Предполагая, что он напечатан как bool (поскольку вы сравниваете его с true), вы должны построить запрос Where следующим образом:

// Build the parameter to the where clause predicate and access AwesomeProperty

var regionParameter = Expression.Parameter(typeof(Region), "region");

var awesomeProperty = Expression.Property(regionParameter, "AwesomeProperty");

// Build the where clause predicate using the AwesomeProperty access

var predicate = Expression.Lambda<Func<Region, bool>>(awesomeProperty);

// Get the table, which serves as the base query

var table = dc.Regions.AsQueryable();

// Call the Where method using the predicate and the table as the base query

var whereCall = Expression.Call(
    typeof(Queryable),
    "Where",
    new[] { table.ElementType },
    table.Expression,
    predicate);

// Get an IQueryable<Region> which executes the where call on the table

var query = table.Provider.CreateQuery<Region>(whereCall);

var results = query.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...