Вы говорите о библиотеке Dynamic LINQ
.
Если у вас установлена VS 2008, вы можете найти подробный документ по API на
<path to vs2008>\Samples\1033\CSharpSamples\LinqSamples\DynamicQuery\Dynamic Expressions.html
Или скачать с здесь
Вот статья Скотта Гу о Dynamic LINQ
Вот выдержка из файла Dynamic Expressions.html
.
Текущий экземпляр
При разборе лямбда-выражения с одним безымянным параметром члены безымянного параметра автоматически попадают в область видимости в строке выражения, и на текущий экземпляр, заданный безымянным параметром, можно ссылаться в целом, используя ключевое слово it. Например,
customers.Where("Country = @0", country);
эквивалентно
customers.Where("it.Country = @0", country);
Все методы расширения IQueryable анализируют свои аргументы выражений как лямбда-выражения с одним безымянным параметром.
Динамический лямбда-вызов
Выражение может ссылаться на другие динамические лямбда-выражения через динамические лямбда-вызовы. Динамический лямбда-вызов состоит из идентификатора переменной подстановки, который ссылается на экземпляр System.Linq.Expressions.LambdaExpression, за которым следует список аргументов. Предоставленные аргументы должны быть совместимы со списком параметров данного динамического лямбда-выражения.
Следующее анализирует два отдельных динамических лямбда-выражения, а затем объединяет их в выражение предиката с помощью динамических лямбда-вызовов:
Expression<Func<Customer, bool>> e1 =
DynamicExpression.ParseLambda<Customer, bool>("City = \"London\"");
Expression<Func<Customer, bool>> e2 =
DynamicExpression.ParseLambda<Customer, bool>("Orders.Count >= 10");
IQueryable<Customer> query =
db.Customers.Where("@0(it) and @1(it)", e1, e2);
Конечно, можно комбинировать статические и динамические лямбда-выражения следующим образом:
Expression<Func<Customer, bool>> e1 =
c => c.City == "London";
Expression<Func<Customer, bool>> e2 =
DynamicExpression.ParseLambda<Customer, bool>("Orders.Count >= 10");
IQueryable<Customer> query =
db.Customers.Where("@0(it) and @1(it)", e1, e2);
Оба приведенных выше примера имеют такой же эффект, как:
IQueryable<Customer> query =
db.Customers.Where(c => c.City == "London" && c.Orders.Count >= 10);