
рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреА рдЕрдЦрдВрдбрддрд╛ рдФрд░ рдкрд╣рдЪрд╛рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ - рд╕реБрд▓рд╣ рдХрд╛ рдХрд╛рд░реНрдп ред
рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдиреНрдпреВрдирддрдо рд╕рдордп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╡рд┐рд╕рдВрдЧрддрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдЙрддрдиреА рд╣реА рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХрд╛рд░реНрдп рдЗрд╕ рддрдереНрдп рд╕реЗ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░рдВрддрд░ рдЧрддрд┐ (~ 100,000 рдкреНрд░рддрд┐ рдШрдВрдЯреЗ рд▓реЗрдирджреЗрди) рдФрд░ 0% рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░
рд╕рдорд╛рдзрд╛рди рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд░реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдорд╛рдирддреЗ рд╣реИрдВред

рдбреЗрдЯрд╛ рдПрдбреЗрдкреНрдЯрд░
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдгрд╛рд▓реА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдХрд╛рдлреА рднрд┐рдиреНрдирддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдореЗрдВ рдЗрди рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рддреБрд▓рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рд▓рд┐рдЦрдХрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВред рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд╛рдиреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рддреБрд▓рдирд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред
рд╣реБрдб рдХреЗ рддрд╣рдд, рдПрдбреЗрдкреНрдЯрд░ рдореЗрдВ рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: HttpClient , SqlClient , DynamoDbClient , рдЖрджрд┐ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд IAdapter рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
public interface IAdapter<T> where T : IModel { int Id { get; } Task<IEnumerable<T>> GetItemsAsync(ISearchModel searchModel); } public interface IModel { Guid Id { get; } int GetHash(); }
рдХреЛрд╖
рд╕рднреА рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдбреЗрдЯрд╛ рд╕рд╛рдордВрдЬрд╕реНрдп рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдбреЗрдкреНрдЯрд░ рдЙрдиреНрд╣реЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░реИрдо рдХреА рдорд╛рддреНрд░рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рд╕рд╛рдордВрдЬрд╕реНрдп рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдмрдбрд╝реЗ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИред
IStorage рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
public interface IStorage { int SourceAdapterId { get; } int TargetAdapterId { get; } int MaxWriteCapacity { get; } Task InitializeAsync(); Task<int> WriteItemsAsync(IEnumerable<IModel> items, int adapterId); Task<IEnumerable<IResultModel>> GetDifferenceAsync(ISearchDifferenceModel model); } public interface ISearchDifferenceModel { int Offset { get; } int Limit { get; } }
рднрдВрдбрд╛рд░рдгред рдПрдордПрд╕ SQL тАЛтАЛрдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╣рдордиреЗ MS SQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ IStorage рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ Db рд╕рд░реНрд╡рд░ рдХреА рддрд░рдл рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред
рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ:
CREATE TABLE [dbo].[Storage_1540747667] ( [id] UNIQUEIDENTIFIER NOT NULL, [adapterid] INT NOT NULL, [qty] INT NOT NULL, [price] INT NOT NULL, CONSTRAINT [PK_Storage_1540747667] PRIMARY KEY ([id], [adapterid]) )
рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдлрд╝реАрд▓реНрдб ( [id] , [рдЕрдиреБрдХреВрд▓рдХрдЖрдИрдб]] рдФрд░ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб ( [рдорд╛рддреНрд░рд╛] , [рдореВрд▓реНрдп] ) рд╣реЛрддреЗ рд╣реИрдВред рд╕рд┐рд╕реНрдЯрдо рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж:
[рдЖрдИрдбреА] - рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рджреЛрдиреЛрдВ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рди
[рдПрдбреЙрдкреНрдЯрд░рдЖрдИрдб] - рдПрдбреЗрдкреНрдЯрд░ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рдЪреВрдВрдХрд┐ рд╕рд╛рдордВрдЬрд╕реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╢реБрд░реВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рд╛рдордВрдЬрд╕реНрдп рд╕рдлрд▓ рд░рд╣рд╛, рддреЛ рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╕рдВрдЧрддрд┐рдпрд╛рдВ рд╣реИрдВред
рднрдВрдбрд╛рд░рдгред рдорд╛рди рддреБрд▓рдирд╛

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рд╕реЗрдЯ рд╣реИрдВ рдЬрд┐рдирдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдлрд╝реАрд▓реНрдб рдлрд╝реАрд▓реНрдб рд╣реИред рдЙрдирдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХреЗ 4 рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдП рддрддреНрд╡ рдХреЗрд╡рд▓ рдмрд╛рдПрдВ рд╕реЗрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред
рдмреА рддрддреНрд╡ рджреЛрдиреЛрдВ рд╕реЗрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИрдВред
рд╕реА рддрддреНрд╡ рдХреЗрд╡рд▓ рд╕рд╣реА рд╕реЗрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред
рдбреА рддрддреНрд╡ рджреЛрдиреЛрдВ рд╕реЗрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдПрдХ рд╣реА рдЕрд░реНрде рд╣реИред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ, рд╣рдореЗрдВ рдП, рдмреА, рд╕реА рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрддреНрд╡реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдЖрдк рдлреБрд▓ рдСрд░реНрдЯ рдЬреЙрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ MS SQL рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
select [s1].[id], [s1].[adapterid] from [dbo].[Storage_1540758006] as [s1] full outer join [dbo].[Storage_1540758006] as [s2] on [s2].[id] = [s1].[id] and [s2].[adapterid] != [s1].[adapterid] and [s2].[qty] = [s1].[qty] and [s2].[price] = [s1].[price] where [s2].[id] is nul
рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ 4 рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ
# | рдЖрдИрдбреА | adapterid | рдЯрд┐рдкреНрдкрдгреА |
---|
1 | guid1 | adp1 | рд░рд┐рдХреЙрд░реНрдб рдХреЗрд╡рд▓ рдмрд╛рдПрдВ рд╕реЗрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдХреЗрд╕ рдП |
2 | guid2 | adp2 | рд░рд┐рдХреЙрд░реНрдб рдХреЗрд╡рд▓ рд╕рд╣реА рд╕реЗрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдХреЗрд╕ рд╕реА |
3 | guid3 | adp1 | рджреЛрдиреЛрдВ рд╕реЗрдЯреЛрдВ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИрдВред рдХреЗрд╕ рдмреА |
4 | guid3 | adp2 | рджреЛрдиреЛрдВ рд╕реЗрдЯреЛрдВ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИрдВред рдХреЗрд╕ рдмреА |
рднрдВрдбрд╛рд░рдгред рд╣реИрд╢рд┐рдВрдЧ
рддреБрд▓рдирд╛ рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд╣реИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд▓рд┐рдЦрдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖рдХрд░ рдЬрдм рджрд░реНрдЬрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИред
рд╣реИрд╢рд┐рдВрдЧ рдХреА рд╕рдмрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдХреНрд░рдордмрджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред

1. рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирдХ рдЧреЗрдЯрд╣реИрд╢рдХреЛрдб () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрдВрдЯ 32 рдкрд░ рд▓реМрдЯрддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рд╣реЛрддрд╛ рд╣реИред
2. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрдХрд░рд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рд╕рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
CREATE TABLE [dbo].[Storage_1540758006] ( [id] UNIQUEIDENTIFIER NOT NULL, [adapterid] INT NOT NULL, [hash] INT NOT NULL, CONSTRAINT [PK_Storage_1540758006] PRIMARY KEY ([id], [adapterid], [hash]) )
рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд▓рд╛рдн рдПрдХ рд░рд┐рдХреЙрд░реНрдб (24 рдмрд╛рдЗрдЯреНрд╕) рдХреЗ рднрдВрдбрд╛рд░рдг рдХреА рдирд┐рд░рдВрддрд░ рд▓рд╛рдЧрдд рд╣реИ, рдЬреЛ рдХрд┐ рддреБрд▓рдирд╛ рдХрд┐рдП рдЧрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рддреБрд▓рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред
select [s1].[id], [s1].[adapterid] from [dbo].[Storage_1540758006] as [s1] full outer join [dbo].[Storage_1540758006] as [s2] on [s2].[id] = [s1].[id] and [s2].[adapterid] != [s1].[adapterid] and [s2].[hash] = [s1].[hash] where [s2].[id] is null
рдкреНрд░реЛрд╕реЗрд╕рд░
рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо рдПрдХ рдРрд╕реЗ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╕реБрд▓рд╣ рдХреЗ рд╕рднреА рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
1. рдПрдбреЗрдкреНрдЯрд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рд╕рдорд╛рдирд╛рдВрддрд░ рд░реАрдбрд┐рдВрдЧ
2. рдбреЗрдЯрд╛ рд╣реИрд╢рд┐рдВрдЧ
3. рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдорд╛рдиреЛрдВ рдХрд╛ рдмрдлрд░ рд░рд┐рдХреЙрд░реНрдб
4. рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг
рд╕рд╛рдордВрдЬрд╕реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╡рд░рдг рдЕрдиреБрдХреНрд░рдо рдЖрд░реЗрдЦ рдФрд░ IProcessor рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рджреЗрдЦрдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
public interface IProcessor<T> where T : IModel { IAdapter<T> SourceAdapter { get; } IAdapter<T> TargetAdapter { get; } IStorage Storage { get; } Task<IProcessResult> ProcessAsync(); Task<IEnumerable<IResultModel>> GetDifferenceAsync(ISearchDifferenceModel model); }

рдзрдиреНрдпрд╡рд╛рдж
рд░рд╛рдп рдХреЗ рд▓рд┐рдП MySale Group рдХреЗ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж: AntonStrakhov , Nesstory , Barlog_5 , Kostya Krivtsun рдФрд░ VeterManve - рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓реЗрдЦрдХред