рдореИрдВ рдЕрдкрдиреА рдмреИрд╕рд╛рдЦреА рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рджреЛрд╕реНрддреЛрдВ рдХреЛ рдкреВрд░реНрдг-рдкрд╛рда MSSQL рдЦреЛрдЬ рдХреИрд╕реЗ рдХрд░реЗрдВред рд╡рд┐рд╖рдп рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдЖрдЬ рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ред
рдпрд╣ рд╕рдм рджрд░реНрдж рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ
рдореИрдВ C # (ASP.NET) рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХрднреА-рдХрднреА рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MSSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред EF рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ, рд╕рд╣реА рдХреНрд╡реЗрд░реАрдЬрд╝ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ, рд╕рд░реНрд╡рд░ рдкрд░ рд▓реЛрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рдЕрд╡рд╕рд░ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЬрд╛рджреВ LINQ рддрдВрддреНрд░ рдмрд╕ рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд▓реБрднрд╛рд╡рдирд╛ рд╣реИред рд╡рд░реНрд╖реЛрдВ рд╕реЗ, рдореИрдВ рдЕрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА ORM рдХреА рддрд░рд╣, EF рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред
MSSQL рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рд╣реИ рдЬреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдкреВрд░реНрдг-рдкрд╛рда рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзреЗрдпрдХреЛрдВ (CONTAINS рдФрд░ FREETEXT) рдпрд╛ рдлрд╝рдВрдХреНрд╢рди (CONTAINSTABLE рдФрд░ FREETEXTTABLE) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ: EF рд╢рдмреНрдж рд╕реЗ рдкреВрд░реНрдг рдкрд╛рда рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!
рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрднрд╡ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ - рдЕрдиреБрдЪреНрдЫреЗрдж, рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:
/// c# public partial class Article { public int Id { get; set; } public System.DateTime Date { get; set; } public string Text { get; set; } public bool Active { get; set; } }
рдлрд┐рд░ рдореБрдЭреЗ рдЗрди рд▓реЗрдЦреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ, рдкрд┐рдЫрд▓реЗ 10 рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓реЗрдЦреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВ:
/// c# dbEntities db = new dbEntities(); var articles = db.Article .Where(n => n.Active) .OrderByDescending(n => n.Date) .Take(10) .ToArray();
рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рддрдХ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реБрдВрджрд░ рд╣реИред рдЪреВрдВрдХрд┐ EF рдореЗрдВ рдкреВрд░реНрдг-рдкрд╛рда рдЪрдпрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ (.NET рдХреЛрд░ 2.1 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣реИ ), рдпрд╣ рдпрд╛ рддреЛ рдХреБрдЫ рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рд╢реБрджреНрдз SQL рдореЗрдВ рдХреНрд╡реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ SQL рдХреНрд╡реЗрд░реА рдЗрддрдиреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ:
SELECT TOP (10) [Extent1].[Id] AS [Id], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Active] AS [Active] FROM [dbo].[Article] AS [Extent1] WHERE [Extent1].[Active] = 1 ORDER BY [Extent1].[Date] DESC
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдЪреАрдЬреЗрдВ рдЗрддрдиреА рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ LINQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рд╢реНрди рд▓рд┐рдЦрд╛ рдерд╛, рддрдм рдореБрдЭреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ SQL рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдкрд╛рда рдорд┐рд▓рд╛, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдореЗрдВ рдкреВрд░реНрдг-рдкрд╛рда рдбреЗрдЯрд╛ рдЪрдпрди рд╢рд░реНрддреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ред рддрдм рдореИрдВрдиреЗ рдЗрд╕реЗ db.Database.SqlQuery
рдХреЛ рднреЗрдЬрд╛ рдФрд░ рдореБрдЭреЗ рдЬреЛ рдбреЗрдЯрд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд╡рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред рдпрд╣ рд╕рдм рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЬрдм рддрдХ рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓ рдЬреЙрдЗрди-рдпреВ рдФрд░ рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рджрд░реНрдЬрди рд╡рд┐рднрд┐рдиреНрди рдлрд┐рд▓реНрдЯрд░ рд▓рдЯрдХрд╛рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рд▓рд┐рдП - рдореБрдЭреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджрд░реНрдж рд╣реИред рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП!
рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдЙрдореНрдореАрдж рдореЗрдВ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рдЦреЛрдЬ рдореЗрдВ рдмреИрдареЗ, рдореИрдВ рдЗрд╕ рднрдВрдбрд╛рд░ рдореЗрдВ рдЖрдпрд╛ред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде, LINQ predicate support (CONTAINS рдФрд░ FREETEXT) рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ IDbCommandInterceptor
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ EF 6 рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬреЛ рдЖрдкрдХреЛ рддреИрдпрд╛рд░ SQL рдХреНрд╡реЗрд░реА рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрддреНрдкрдиреНрди рдорд╛рд░реНрдХрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ Contains
рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕ рд╕реНрдерд╛рди рдХреЛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
/// c# var text = FullTextSearchModelUtil.Contains("code"); db.Tables.Where(c=>c.Fullname.Contains(text));
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдбреЗрдЯрд╛ рдЪрдпрди рдХреЛ рдореИрдЪреЛрдВ рдХреА рд░реИрдВрдХ рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЕрдм рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ SQL рдХреНрд╡реЗрд░реА рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдорд╛рдиреНрдп LIKE рдХреЛ рд╡рд┐рдзреЗрдп рдЪрдпрди рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
рддреЛ, рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╡рд╛рд▓ рдерд╛: рдХреНрдпрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд MS SQL рдлрд╝рдВрдХреНрд╢рдВрд╕ (CONTAINSTABLE рдФрд░ FREETEXTTABLE) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рд╕рдм LINQ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХреЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореИрдЪреЛрдВ рдХреА рд░реИрдВрдХ рджреНрд╡рд╛рд░рд╛ рдХреНрд╡реЗрд░реА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рднреА? рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LINQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдЪреВрдВрдХрд┐ рдкреВрд░реНрдг-рдкрд╛рда рдЪрдпрди рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ, JOIN рдХреЛ рдЕрдХреНрд╕рд░ рд░реИрдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрднрд╛рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВрдиреЗ LINQ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ LINQ рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
/// c# var queryFts = db.FTS_Int.Where(n => n.Query.Contains(queryText)); var query = db.Article .Join(queryFts, article => article.Id, fts => fts.Key, (article, fts) => new { article.Id, article.Text, fts.Key, fts.Rank, }) .OrderByDescending(n => n.Rank);
рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЕрднреА рддрдХ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ рдХреЛ рд░реИрдВрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрд╛рдВрдЯрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЧрдИ рд╣реИред рдпрд╣ рдЗрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рд╛ред
рдЗрд╕ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдЧ FTS_Int
:
/// c# public partial class FTS_Int { public int Key { get; set; } public int Rank { get; set; } public string Query { get; set; } }
рдирд╛рдо рд╕рдВрдпреЛрдЧ рд╕реЗ рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдореБрдЦ рдХреЙрд▓рдо рдХреЛ рдЦреЛрдЬ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдВрдЬреА рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рдЯрд┐рдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, [Article].[Id]
рдЯрд╛рдЗрдк int
))ред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрдВрдЬреА рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░ рдкреНрд░рд╢реНрди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╕ рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЧ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдХреБрдВрдЬреА рдмрдирд╛рдПрдБред
рдкреВрд░реНрдг-рдкрд╛рда рдХреНрд╡реЗрд░реА рдХреЗ рдЧрдарди рдХреЗ рд▓рд┐рдП рд╢рд░реНрдд рдХреЛ queryText
рдЪрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдЗрд╕ рдЪрд░ рдХреЗ рдкрд╛рда рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
/// c# string queryText = FtsSearch.Query( dbContext: db, // , ftsEnum: FtsEnum.CONTAINS, // : CONTAINS FREETEXT tableQuery: typeof(News), // tableFts: typeof(FTS_Int), // search: "text"); //
рдПрдХ рддреИрдпрд╛рд░ рдЕрдиреБрд░реЛрдз рдФрд░ рдбреЗрдЯрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд╛ рдкреВрд░рд╛ рд╣реЛрдирд╛:
/// c# var result = FtsSearch.Execute(() => query.ToList());
рдЕрдВрддрд┐рдо FtsSearch.Execute
рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ IDbCommandInterceptor
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓реЗрдЦрдХ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдХреНрд╡реЗрд░реА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдХреНрд╡реЗрд░реА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рддрдВрддреНрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдпреЛрдЬрди рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдореЗрд░реЗ рд▓рд┐рдП рдмреЗрдХрд╛рд░ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЦреБрдж рдХреЛ рд╕рдВрдЪрд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд╡реЗрд░реА рдСрдЯреЛ-рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред
рдЖрд╡реЗрджрди
рдореИрдВ edmx рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдСрдЯреЛ-рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЪреВрдВрдХрд┐ рдЖрдк FTS_Int
рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг EF рдореЗрдВ рдмрдирд╛рдП рдЧрдП FTS_Int
рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдореЙрдбрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рд╣реИ (рд╢рд╛рдпрдж рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдЬрд╛рдирддрд╛ рд╣реЛ, рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рд╕реЗ рдЦреБрд╢реА рд╣реЛрдЧреА):
Edmx рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

CREATE TABLE [dbo].[FTS_Int] ( [Key] INT NOT NULL, [Rank] INT NOT NULL, [Query] NVARCHAR (1) NOT NULL, CONSTRAINT [PK_FTS_Int] PRIMARY KEY CLUSTERED ([Key] ASC) );
рдЙрд╕рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ edmx рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдмрдирд╛рдИ рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрд╕рдХрд╛ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
/// c# public partial class FTS_Int { public int Key { get; set; } public int Rank { get; set; } public string Query { get; set; } }
рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрдИ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдХреНрд╡реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдиреЗред рдкреВрд░реНрдг-рдкрд╛рда рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг:
/// c# string queryText = FtsSearch.Query( dbContext: db, ftsEnum: FtsEnum.CONTAINS, tableQuery: typeof(Article), tableFts: typeof(FTS_Int), search: "text"); var queryFts = db.FTS_Int.Where(n => n.Query.Contains(queryText)); var query = db.Article .Where(n => n.Active) .Join(queryFts, article => article.Id, fts => fts.Key, (article, fts) => new { article, fts.Rank, }) .OrderByDescending(n => n.Rank) .Take(10) .Select(n => n.article); var result = FtsSearch.Execute(() => query.ToList());
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рдорд░реНрдерди рд╣реИ:
/// c# var result = await FtsSearch.ExecuteAsync(async () => await query.ToListAsync());
рд╕реНрд╡рддрдГ рд╕реБрдзрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рдЙрддреНрдкрдиреНрди SQL рдХреНрд╡реЗрд░реА:
SELECT TOP (10) [Project1].[Id] AS [Id], [Project1].[Date] AS [Date], [Project1].[Text] AS [Text], [Project1].[Active] AS [Active] FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Active] AS [Active], [Extent2].[Rank] AS [Rank] FROM [dbo].[Article] AS [Extent1] INNER JOIN [dbo].[FTS_Int] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Key] WHERE ([Extent1].[Active] = 1) AND ([Extent2].[Query] LIKE @p__linq__0 ESCAPE N'~') ) AS [Project1] ORDER BY [Project1].[Rank] DESC
рд╕реНрд╡рддрдГ рдХреНрд╡реЗрд░реА рдХреЗ рдмрд╛рдж рдЙрддреНрдкрдиреНрди SQL рдХреНрд╡реЗрд░реА:
SELECT TOP (10) [Project1].[Id] AS [Id], [Project1].[Date] AS [Date], [Project1].[Text] AS [Text], [Project1].[Active] AS [Active] FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[Date] AS [Date], [Extent1].[Text] AS [Text], [Extent1].[Active] AS [Active], [Extent2].[Rank] AS [Rank] FROM [dbo].[Article] AS [Extent1] INNER JOIN CONTAINSTABLE([dbo].[Article],(*),'text') AS [Extent2] ON [Extent1].[Id] = [Extent2].[Key] WHERE ([Extent1].[Active] = 1) AND (1=1) ) AS [Project1] ORDER BY [Project1].[Rank] DESC
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ:
CONTAINSTABLE([dbo].[Article],(*),'text')
рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ FtsSearch.Query
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдлрд╝реАрд▓реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░
рдкрд░рд┐рдгрд╛рдо LINQ рдореЗрдВ рдлреБрд▓-рдЯреЗрдХреНрд╕реНрдЯ рд╕рд░реНрдЪ рд╕рдкреЛрд░реНрдЯ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВред
FtsSearch.Query
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЦреЛрдЬ рдкреИрд░рд╛рдореАрдЯрд░ SQL рдЗрдВрдЬреЗрдХреНрд╢рди рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЪреЗрдХ рдпрд╛ рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЪрд░ рдХрд╛ рдорд╛рди рдЕрдиреБрд░реЛрдз рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдореИрдВрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬреЛ рдЕрдХреНрд╖рд░реЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╕рднреА рд╡рд░реНрдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
рдЖрдкрдХреЛ рдкреВрд░реНрдг-рдкрд╛рда рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рднрд╡рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░
CONTAINSTABLE([dbo].[News],(*),' ')
рдЗрд╕рдХрд╛ рдПрдХ рдЕрдорд╛рдиреНрдп рдкреНрд░рд╛рд░реВрдк рд╣реИ рдХреНрдпреЛрдВрдХрд┐ MS SQL рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд╢рд╛рдмреНрджрд┐рдХ рд╢рдмреНрджреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
CONTAINSTABLE([dbo].[News],(*),' and ')
рдпрд╛ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓реЗрдВ
FREETEXTTABLE([dbo].[News],(*),' ')
рдкреНрд░рд╢реНрди рдмрдирд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рд▓реЙрдЧрд┐рдВрдЧ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:
/// c# db.Database.Log = (val) => Console.WriteLine(val);
рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХреНрд╡реЗрд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдСрдЯреЛ-рд░рд┐рдкреНрд▓реЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдХрдИ рдЪрдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдЬрд╛рдВрдЪ рдХреА рдФрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред
рдЧрд┐рдЯрд╣рдм рд╕реНрд░реЛрдд