
рдореЗрд░реЗ рдХрд╛рдо рдХреА рдкреНрд░рдХреГрддрд┐ рд╕реЗ, рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рд╡рд┐рднрд┐рдиреНрди рдЫреЛрдЯреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдкрдбрд╝рддреЗ рд╣реИрдВ, рдореБрдЦреНрдпрддрдГ ASP.NET MVC рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╕рд╛рдЗрдЯреНрд╕ред рдХрд┐рд╕реА рднреА рдЖрдзреБрдирд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдбреЗрдЯрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реА рдкрд╕рдВрдж
рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб рдлрд░реНрд╕реНрдЯ рдкрд░ рдЧрд┐рд░реА рдереАред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдЕрдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рд╕рдордп рдирд╣реАрдВ рдмрд┐рддрд╛рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдереА рдХрд┐ рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдХреНрд╖рдорддрд╛ рдХреА рдХрдореА рдереА, рд╕рд╛рде рд╣реА рдЦреЗрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЖрдзреБрдирд┐рдХ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
Googling рдХреЗ рдШрдВрдЯреЛрдВ рдХреЗ рдмрд╛рдж, StackOverflow рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рди рд╕рд╛рдЗрдЯреЛрдВ рд╕реЗ рджрд░реНрдЬрдиреЛрдВ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЗрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд┐рд╕реА рднреА рдирдИ (рдореМрдЬреВрджрд╛) рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХреАрдХрд░рдг рдХреА рдЖрд╕рд╛рдиреА рд╣реИред рдкрд╣рд▓реЗ рдХреЛрдб рдореЗрдВ, рдпрд╣ рд╕рдм рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:
public class SomeClass { public int Id { get; set; } [Index] public string Name { get; set; } [FullTextIndex] public string Description { get; set; } }
рдЙрд╕реА рд╕рдордп, рдореИрдВ DatabaseInitializer рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдФрд░ рдЕрдиреНрдп рдЧреИрд░-рдХрд╛рдиреВрдиреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░реВрдВрдЧрд╛ред
рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдореИрдВ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2013 рдЕрд▓реНрдЯреАрдореЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЪрд▓рд┐рдП рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рддреБрд░рдВрдд рдПрдирдЧреЗрдЯ рдХрдВрд╕реЛрд▓ (рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрдВрд╕реЛрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ 6 рдмреАрдЯрд╛ 1 рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
PM> рдЗрдВрд╕реНрдЯреЙрд▓-рдкреИрдХреЗрдЬ EntityFramework -PreрдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдФрд░ FullTextSearch рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдмрдирд╛рдПрдБ, рд╕рд╛рде рд╣реА FullTextSearch рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рднреА рдХрд░реЗрдВ:
public class IndexAttribute : Attribute { } public class FullTextIndexAttribute : Attribute { } public class FullTextIndex { public enum SearchAlgorithm { Contains, FreeText } }
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рд╕рдордЭ рдЧрдП рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреЙрдиреНрдЯреЗрдВрд╕ рдФрд░ рдлреНрд░реА рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ
рдпрд╣рд╛рдВ ред
рдЕрдЧрд▓рд╛, DbContext рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:
public abstract class DbContextIndexed : DbContext { private static bool Complete; private int? language; public int Language { get { return language.HasValue ? language.Value : 1049;
рдкреЛрд╕реНрдЯ рдХреЛ рдирд╣реАрдВ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рд╛рд░рд╛рдВрд╢ рдФрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,
GitHub'e рдкрд░ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдгред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, EF DbContext рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдореЙрдбрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрд░рдорд╢рдГ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, DbContext рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣рд░ рдмрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд▓реЛрдб рди рдХрд░рдиреЗ рдФрд░ рдИрдПрдл рдХреА рд╕рд░реНрд╡реЛрддреНрддрдо рдкрд░рдВрдкрд░рд╛рдУрдВ рдореЗрдВ, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ __IndexBuildingHistory рдЙрдкрдпреЛрдЧрд┐рддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЗрдВрдбреЗрдХреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдЧреАред рд╢реЗрд╖ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдЖрдк рдЕрднреА рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрдВрдбреЗрдХреНрд╕ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдЕрднреА рднреА рдкреВрд░реНрдг-рдкрд╛рда рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ:
public static class IQueryableExtension { public static IQueryable<T> FullTextSearch<T>(this DbSet<T> queryable, Expression<Func<T, bool>> func, FullTextIndex.SearchAlgorithm algorithm = FullTextIndex.SearchAlgorithm.FreeText) where T : class { var internalSet = queryable.AsQueryable() .GetType() .GetProperty("System.Data.Entity.Internal.Linq.IInternalSetAdapter.InternalSet", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(queryable.AsQueryable()); var entitySet = (EntitySet)internalSet.GetType() .GetProperty("EntitySet") .GetValue(internalSet); var searchType = algorithm == FullTextIndex.SearchAlgorithm.Contains ? "CONTAINS" : "FREETEXT"; var columnName = ((MemberExpression)((BinaryExpression)func.Body).Left).Member.Name; var searchPattern = ((ConstantExpression)((BinaryExpression)func.Body).Right).Value; return queryable.SqlQuery( String.Format("SELECT * FROM {0} WHERE {1};", entitySet.Name, String.Format("{0}({1},'{2}')", searchType, columnName, searchPattern))) .AsQueryable(); } }
рдпрд╣ рд╕рдм, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдиреБрдХреНрд░рдорд┐рдд рдФрд░ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрдХрд╛рдИ рдврд╛рдВрдЪреЗ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдЬ рдХреЛрдИ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдореЗрд░реА рдЕрдиреБрдХреНрд░рдордг
рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИ (рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреЙрдк рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рдЖрджрд┐), рддреЛ рдЖрдк рдЧрд┐рдЯрд╣рдм рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдореБрдЭреЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред ред рд▓реЗрдЦ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдмрд╛рдК рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдордиреЗ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рдереА рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред
рдХреЗ рдЙрдкрдпреЛрдЧ
1. рдПрдХ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
2. NuGet рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ 6 рдмреАрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ
3. рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ (рдпрджрд┐ рдЖрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдЖрдк рддреИрдпрд╛рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ)
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдФрд░ рд░рд┐рд╢реНрддреЛрдВ рдХреЗ рдмрд┐рдирд╛, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЗрдХрд╛рдИ рдмрдирд╛рдПрдВ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
public class Animal { public int Id { get; set; } [Index] [StringLength(200)] public string Name { get; set; } [FullTextIndex] public string Description { get; set; } public int Family { get; set; } [FullTextIndex] public string AdditionalDescription { get; set; } }
рдирд╛рдо (рдирд╛рдо) рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╡рд░ рдХрд╛ рд╕рд╛рд░, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ, рд╡рд┐рд╡рд░рдг (рд╡рд┐рд╡рд░рдг) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ - рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг-рдкрд╛рда рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╕реНрдЯреНрд░рд┐рдВрдЧ [StringLength (200)] рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬрдм рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рдкрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ MSSQL рдЖрдкрдХреЛ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдкрд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдЖрдХрд╛рд░ 900 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ - рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдХрд┐рддрдирд╛ рд╣реИ рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
5. рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдБ:
public class DataContext : DbContextIndexed { public DbSet<Animal> Animals { get; set; } }
рдпрд╣рд╛рдБ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдЖрдк DbContext рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ DbContextIndexed рд╕реЗ
6. Programm.cs рдореЗрдВ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рднрдбрд╝рдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдХреЙрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
static void Main(string[] args) { using (var context = new DataContext()) { var temp = context.Animals.ToList(); } }
7. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдХреЙрдиреНрдлрд┐рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЦреЗрдВ:
<configuration> <connectionStrings> <add name="DataContext" connectionString="Data Source=(local)\SQL; Initial Catalog=EFCF; Integrated Security=true;" providerName="System.Data.SqlClient"/> </connectionStrings> </configuration>
8. рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП F5 рджрдмрд╛рдПрдВ, рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Managment Studio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдордиреЗ рдкреНрд▓рд╛рди рдХрд┐рдпрд╛ рдерд╛:

9. рдЕрдм, рдЦреЛрдЬ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
using (var context = new DataContext()) { context.Animals.Add(new Animal { Name = "", Description = " , ." }); context.Animals.Add(new Animal { Name = "", Description = " , ." }); context.Animals.Add(new Animal { Name = "", Description = " - ." }); context.Animals.Add(new Animal { Name = "", Description = " ." }); context.Animals.Add(new Animal { Name = "", Description = " ." }); context.Animals.Add(new Animal { Name = " ", Description = " , ." }); context.SaveChanges(); }
рдЪрд▓рд╛рдПрдВ рддрд╛рдХрд┐ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд▓рд┐рдЦрд╛ рд╣реЛ, рдЕрдм рдЦреЛрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
using (var context = new DataContext()) { foreach (var pet in context.Animals.FullTextSearch(f => f.Description == "")) Console.WriteLine("{0} - {1}", pet.Name, pet.Description); }
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдореЗрд░реЗ рдкрд╛рд╕ MSSQL 2008R2 рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ 2013 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рд╣рдореЗрдВ рдЕрднреА рднреА рдкреИрдВрдерд░ рдХрд╛ рдореВрд▓реНрдп рдорд┐рд▓реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ "рдХреИрдЯ" рднреА рдЕрдзреНрдпрдпрди рдХрд░реЗрдЧрд╛ред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, "рдорд╛рдирдХ" рддрд░реАрдХреЗ рд╕реЗ, рдЖрдк рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦреЗрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 95% рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░реА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрдХрд╛рдИ рдврд╛рдВрдЪреЗ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдЕрднреА рднреА рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмреЙрдХреНрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
рддреИрдпрд╛рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
рдЬрд╝рд┐рдк рдкреНрд░рд╛рд░реВрдк рдореЗрдВdll рдкреНрд░рд╛рд░реВрдк рдореЗрдВрдкрд░рд┐рдпреЛрдЬрдирд╛
GitHub рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ
рд╣реИрдиреБрдЧреЗрдЯ рдкрд░ рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ 6 рдмреАрдЯрд╛