Предполагая, что:
public class Person
{
public string LastName { get; set; }
}
IQueryable<Person> collection;
Ваш запрос:
var query =
from p in collection
where p.LastName == textBox.Text
select p;
означает то же, что и:
var query = collection.Where(p => p.LastName == textBox.Text);
, который компилятор переводит из метода расширения в:
var query = Queryable.Where(collection, p => p.LastName == textBox.Text);
Второй параметр Queryable.Where
- это Expression<Func<Person, bool>>
. Компилятор понимает тип Expression<>
и генерирует код для построения дерева выражений , представляющего лямбду:
using System.Linq.Expressions;
var query = Queryable.Where(
collection,
Expression.Lambda<Func<Person, bool>>(
Expression.Equal(
Expression.MakeMemberAccess(
Expression.Parameter(typeof(Person), "p"),
typeof(Person).GetProperty("LastName")),
Expression.MakeMemberAccess(
Expression.Constant(textBox),
typeof(TextBox).GetProperty("Text"))),
Expression.Parameter(typeof(Person), "p"));
Вот что означает синтаксис запроса.
Вы можете сами вызывать эти методы. Чтобы изменить сравниваемое свойство, замените это:
typeof(Person).GetProperty("LastName")
с:
typeof(Person).GetProperty(dropDown.SelectedValue);