рдХреНрд╡реЗрд░реА рдкреНрд░рджрд╛рддрд╛ рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ
рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рджрд╛рддрд╛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛:
var result = _context.Humans .Select(x => $"Name: {x.Name} Age: {x.Age}") .Where(x => x != "") .ToList();
рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛:
var result = _context.Humans .Select(x => "Name " + x.Name + " Age " + x.Age) .Where(x => x != "") .ToList();
рдХреНрд▓рд╛рдЗрдВрдЯрдПрд╡рд▓реНрдпреВрд╢рди (рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрдкрд╡рд╛рдж) рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд░реНрджрдирд╛рдХ рд╣реИ, рдЗрд╕ рдкреНрд░рдХреНрд╖реЗрдк рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдЯреЛ-рдореИрдкрд░ рдХреЗ рд╕рднреА рдкреНрд░реЛрдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдХрдареЛрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдЕрдзреАрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдорд╛рдзрд╛рди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдВред
рд╣рдо рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ
рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЯреНрд░реА рдореЗрдВ рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирд╕реНрдЯреНрд░реАрдорд┐рдВрдЧрдмрд░реНрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирдЯреЙрд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐, рдпрд╣ рдХреБрдЫ рдиреЛрдбреНрд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣
рдШрд╛рддрдХ рдирд╣реАрдВ):
рдпрд╛ рдРрд╕рд╛ рд╣реИ, рдЬрдм 3 рд╕реЗ рдЕрдзрд┐рдХ рддрд░реНрдХ рд╣реИрдВ
Format("Name:{0} Age:{1}", new [] {x.Name, Convert(x.Age, Object)))
рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рджрд╛рддрд╛ рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдирд╣реАрдВ рд╕реАрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ ToString (), рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
((("Name: " + x.Name) + " Age: ") + Convert(x.Age, Object)))
рдореИрдВ рдПрдХ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЯреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рддреН MethodCallExpression рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЯреНрд░реА рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ C # рд╣рдореЗрдВ рдЯреНрд░реА - рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирд╡рд┐рдЬрд┐рдЯрд░ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд▓реЛрдЧ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ ред
рдпрд╣ рдХреЗрд╡рд▓ VisitMethodCall рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ MethodCallExpression рдХрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЖрдЗрдП рдХрд╛рд░реНрдп рдХреЛ рдХрдИ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ:
- рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕реНрд╡рд░реВрдк рд╡рд┐рдзрд┐ рдереА рдЬреЛ VisitMethodCall рдкрд░ рдЖрдИ рдереА
- рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдорд╡рд░реНрддреА рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ
- рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдзрд┐ рдХреЗ рд╕рднреА рдЕрдзрд┐рднрд╛рд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ
- рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдЖрдЧрдВрддреБрдХ рдХреЙрд▓ рдХрд░реЗрдЧрд╛
рдкрд╣рд▓рд╛ рднрд╛рдЧ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдкреНрд░рд╛рд░реВрдк 4 рд╡рд┐рдзрд┐ рдореЗрдВ рдУрд╡рд░рд▓реЛрдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдореЗрдВ
public static string Format(string format, object arg0) public static string Format(string format, object arg0,object arg1) public static string Format(string format, object arg0,object arg1,object arg2) public static string Format(string format, params object[] args)
рд╣рдо рдЙрдирдХреЗ MethodInfo рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
private IEnumerable<MethodInfo> FormatMethods => typeof(string).GetMethods().Where(x => x.Name.Contains("Format"))
рдХрдХреНрд╖рд╛, рдЕрдм рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ MethodCallExpression рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдзрд┐ "рдЖ рдЧрдИ рд╣реИ"ред
рдЬрдм рдПрдХ рдкреЗрдбрд╝ рдкрд░ рдЪрдврд╝рддреЗ рд╣реИрдВ, рддреЛ VisitMethodCall "рдЖ рд╕рдХрддрд╛ рд╣реИ":
- рдСрдмреНрдЬреЗрдХреНрдЯ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдзрд┐
- рдСрдмреНрдЬреЗрдХреНрдЯ [] рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдзрд┐
- рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдзрд┐ рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВ
рдПрдХ рдмрд┐рдЯ рдХрд╕реНрдЯрдо рдкреИрдЯрд░реНрди рдорд╢реАрдирд┐рдВрдЧ
рдЕрдм рддрдХ, рдХреЗрд╡рд▓ 3 рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдРрд╕реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛:
public class PatternMachingStructure { public Func<MethodInfo, bool> FilterPredicate { get; set; } public Func<MethodCallExpression, IEnumerable<Expression>> SelectorArgumentsFunc { get; set; } public Func<MethodCallExpression, IEnumerable<Expression>, Expression> ReturnFunc { get; set; } } var patternMatchingList = new List<PatternMachingStructure>()
FilterPredicate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЙрди 3 рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред SelectorArgumentFunc рдХреЛ рдлреЙрд░реНрдореЗрдЯ рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдПрдХ рд╕рдорд╛рди рд░реВрдк рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, ReturnFunc рд╡рд┐рдзрд┐, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирдпрд╛ рдкреНрд░рддрд┐рдЧрдорди рд▓реМрдЯрд╛рдПрдЧреАред
рдЕрдм рд╣рдо рдкреНрд░рдХреНрд╖реЗрдк рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд╖реЗрдк рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
private Expression InterpolationToStringConcat(MethodCallExpression node, IEnumerable<Expression> formatArguments) {
InterpolationToStringConcat рдХреЛ рдЖрдЧрдВрддреБрдХ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ ReturnFunc рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ
(рдЬрдм рдиреЛрдбред рдореАрдереЛрдб == string.Format)
protected override Expression VisitMethodCall(MethodCallExpression node) { var pattern = patternMatchingList.First(x => x.FilterPredicate(node.Method)); var arguments = pattern.SelectorArgumentsFunc(node); var expression = pattern.ReturnFunc(node, arguments); return expression; }
рдЕрдм рд╣рдореЗрдВ рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдзрд┐рднрд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ рдФрд░ рдкреИрдЯрд░реНрдирдореИрдХреЗрдирд┐рд╕реНрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ
patternMatchingList = new List<PatternMachingStructure> {
рддрджрдиреБрд╕рд╛рд░, VisitMethodCall рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо рдЗрд╕ рд╢реАрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рдкреЙрдЬрд┐рдЯрд┐рд╡ FilterPredicate рддрдХ рдЬрд╛рдПрдВрдЧреЗ, рдлрд┐рд░ рддрд░реНрдХреЛрдВ (SelectorArgumentFunc) рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ рдФрд░ ReturnFunc рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
рдЖрдЗрдП, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрд┐рдП, рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдкреНрд░рдХреНрд╖реЗрдк рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдЧрдВрддреБрдХ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ IQuryableProvider CreateQuery рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдореВрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдХреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдЧрд╛:
public static IQueryable<T> ReWrite<T>(this IQueryable<T> qu) { var result = new InterpolationStringReplacer<T>().Visit(qu.Expression); var s = (IQueryable<T>) qu.Provider.CreateQuery(result); return s; }
рдХрд╛рд╕реНрдЯ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред IIVable <T> рдореЗрдВ рдЯрд╛рдЗрдк IQueryable рдХреЗ Cider..Preatider.CreateQuery (рдкрд░рд┐рдгрд╛рдо), рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ c # рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╕ рд╣реИ (IEnumerable <T> рджреЗрдЦреЗрдВ), рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЙрддреНрдкрдиреНрди рд╣реБрдЖред рдЬреЛ IQueryable / IEnumerable рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЯреА рдХреЛ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрд╕реЗ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдпрд╣ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рднреА рд▓рдЧрд╛рддрд╛ рд╣реИ (рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред
рд╕рдВрдкреВрд░реНрдг
рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ ReWrite рд▓рд╛рдЧреВ рдХрд░реЗрдВ
var result = _context.Humans .Select(x => $"Name: {x.Name} Age: {x.Age}") .Where(x => x != "") .ReWrite() .ToList();
GitHub