рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!
рдЖрдЬ рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдиреЗ рдШреБрдЯрдиреЗ рдкрд░ рдХреБрдЫ рд╣реА рдШрдВрдЯреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдирдХреЗ ╬╗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдХреНрдпреЛрдВ рдкрдбрд╝ рд╕рдХрддреА рд╣реИ - рдХрдЯреМрддреА рдХреЗ рддрд╣рддред
рдкрд╣рдЪрд╛рди
рдЬреАрд╡рди рдореЗрдВ, рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ LINQ рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдЧрдгрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ
рдХрд░реНрдордЪрд╛рд░реА рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдВрдЧрдгрд┐рдд рдХреНрд╖реЗрддреНрд░
FullName рд╣реИclass Employee { public string FullName { get { return FirstName + " " + LastName; } } public string LastName { get; set; } public string FirstName { get; set; } }
рдФрд░ рдлрд┐рд░ рдЧреНрд░рд╛рд╣рдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ рдФрд░ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд░реНрдордЪрд╛рд░реА рдХреЗ рдкреВрд░реНрдг рдирд╛рдо рд╕реЗ рдПрдХ рдЦреЛрдЬ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рд▓рд┐рдЦреЗрдВ:
var employees = (from employee in db.Employees where (employee.FirstName + " " + employee.LastName) == "Test User" select employee).ToList();
рд╣рд╛рдБ,
FullName рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреНрд╖реЗрддреНрд░ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдкрд░рд┐рдХрд▓рд┐рдд рдлрд╝реАрд▓реНрдб рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рднрд╛рдЧ рд▓рд┐рдпрд╛ рдерд╛ред
public class WayPoint { // public virtual bool IsValid { get { return (Account == null) || (Role == null || Account.Role == Role) && (StructuralUnit == null || Account.State.StructuralUnit == StructuralUnit); } } }
рдпрд╣ рдХрдард┐рди рд╣реИред рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?
NHibernate рдореЗрдВ <рд╕реВрддреНрд░>
рдпрджрд┐ рдЖрдк NHibernate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдХ рд╕реВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рд░реНрдЧ рдмрд╣реБрдд рд╣реА рдЕрдиреБрдХреВрд▓, рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, <рд╕реВрддреНрд░> рдХреЗрд╡рд▓ sql рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред
рдХреЗрд╡рд▓ NHibernate рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
class Employee { private static readonly CompiledExpression<Employee,string> fullNameExpression = DefaultTranslationOf<Employee>.Property(e => e.FullName).Is(e => e.FirstName + " " + e.LastName); public string FullName { get { return fullNameExpression.Evaluate(this); } } public string LastName { get; set; } public string FirstName { get; set; } } var employees = (from employee in db.Employees where employee.FullName == "Test User" select employee).WithTranslations().ToList()
рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдЕрдиреБрд░реЛрдз рд╕реБрдВрджрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдкрддреНрддрд┐ рдХреА рдШреЛрд╖рдгрд╛ рд╕рд┐рд░реНрдл рднрдпрд╛рдирдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд╕рдордп ╬╗-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдкрд░рд┐рдХрд▓рд┐рдд рдлрд╝реАрд▓реНрдб рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдХрдо рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдореЗрд░реЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЖрддреЗ рд╣реИрдВ - рдбреЗрд▓рд┐рдЧреЗрдЯрдбреЗрдХреЛрдореНрдкрд╛рдЗрд▓рд░
DelegateDecompiler
рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐
[рдЧрдгрдирд╛] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдХрд▓рд┐рдд рдлрд╝реАрд▓реНрдб рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ, рдФрд░
.Decompile () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред
class Employee { [Computed] public string FullName { get { return FirstName + " " + LastName; } } public string LastName { get; set; } public string FirstName { get; set; } } var employees = (from employee in db.Employees where employee.FullName == "Test User" select employee).Decompile().ToList()
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ (рдЖрдк рдЦреБрдж рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдХреЛрдИ рднреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)
рдЬрдм
.Decompile () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ decompiler рд╕рднреА рдЧреБрдгреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ
[рд╕рдВрдЧрдгрд┐рдд] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдирдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛ред рдпрд╛рдиреА рдЕрдиреБрд░реЛрдз рдХреЛ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдлрд╝реЙрд░реНрдо рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
var employees = (from employee in db.Employees where (employee.FirstName + " " + employee.LastName) == "Test User" select employee).ToList();
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ
Mono.Cecil рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛,
рдЬреАрди-рдмреИрдкреНрдЯрд┐рд╕реНрдЯ рдЗрд╡реИрди ,
рдПрдХ рдбрд┐рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА Mono.Reflection (
GitHub ,
NuGet ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
Mono.Cecil рдЕрдкрдиреЗ
рдмрд▓реНрдХрдиреЗрд╕ рдХреЗ рдХрд╛рд░рдг рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреБрдирд╢реНрдЪ: рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЧрдгрдирд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрдВрджрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ LINQ рдкреНрд░рджрд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
PPS: рдпрд╣ рдЕрд▓реНрдлрд╝рд╛ рд╕рдВрд╕реНрдХрд░рдг рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ - рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд╕рдВрджрд░реНрдн
GitHub рд╕реНрд░реЛрдд рдХреЛрдбNuGet рдкреИрдХреЗрдЬ