У меня в качестве примера этот бит кода, в основном он выплевывает
p => p.fieldname.StartsWith("123")
Но кого бы я расширил, чтобы сделать что-то вроде этого:
p => p.anotherentity.fieldname.StartsWith("123")
Вот пример кода, который я реорганизовал для собственных нужд:
string propertyName = "FirstName";
string methodName = "StartsWith";
string keyword = "123";
Type t = typeof (Person);
ParameterExpression paramExp = Expression.Parameter(t, "p");
// the parameter: p
MemberExpression memberExp = Expression.MakeMemberAccess(paramExp,
t.GetMember(propertyName).FirstOrDefault());
// part of the body: p.FirstName
MethodCallExpression callExp = Expression.Call(memberExp,
typeof (string).GetMethod(methodName,
new Type[] {typeof (string)}),
Expression.Constant(keyword));
// the body: p.FirstName.StartsWith("123")
Expression<Func<Person, bool>> whereExp = Expression.Lambda<Func<Person, bool>>(callExp, paramExp);
Expression<Func<Person, string>> selectExp = Expression.Lambda<Func<Person, string>>(memberExp, paramExp);
Console.WriteLine(whereExp); // p => p.FirstName.StartsWith("123")
Console.WriteLine(selectExp); // p => p.FirstName
Для дальнейшего объяснения позвольте мне показать вам, что я хотел бы сделать:
public class Person
{
public string IdentityCode {get;set;}
public Loans Loans {get;set;}
}
public class Loans
{
public int Id {get;set;}
public Asset Assets {get;set;}
public Person person {get;set;}
}
public class Asset
{
public string SerialNumber {get;set;}
}
Затем с помощью выражения создайте что-то вроде этого:
p => p.Loans.Asset.SerialNumber.StartsWith("123)
Или
p => p.Loans.Person.IdentityCode.StartsWith("123")