เบงเบดเบ—เบตเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เปƒเบ™ C#.NET

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

ะ’ เบšเบปเบ”เบ‚เบฝเบ™เบ™เบตเป‰ เบšเบฒเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป„เบ”เป‰เบ–เบทเบเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ เบชเบญเบšเบ–เบฒเบก LINQ.
เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบšเบฒเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ•เปเปˆเบเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบš เบชเบญเบšเบ–เบฒเบก LINQ.

เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบงเปˆเบฒ LINQ(Language-Integrated Query) เป€เบ›เบฑเบ™เบžเบฒเบชเบฒเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ เปเบฅเบฐเบชเบฐเบ”เบงเบเปƒเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™.

ะ LINQ เบเบฑเบš SQL เป€เบ›เบฑเบ™เป€เบ—เบเป‚เบ™เป‚เบฅเบเบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™ DBMS. เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบญเปเบฒโ€‹เบ™เบฒเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบเบฑเบšโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹, เบšเปˆเบญเบ™โ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบชเบญเบšโ€‹เบ–เบฒเบกโ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบชเป‰เบฒเบ‡โ€‹เบ‚เบถเป‰เบ™โ€‹เป‚เบ”เบโ€‹เบœเปˆเบฒเบ™โ€‹เบžเบฒโ€‹เบชเบฒโ€‹เบ›เบฐโ€‹เบเบฒเบ”โ€‹, เบŠเบถเปˆเบ‡โ€‹เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เป€เบ›เบฑเบ™โ€‹. SQL เบชเบญเบšเบ–เบฒเบก เป€เบงเบ—เบตเปเบฅเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เป‚เบ”เบ DBMS เบžเบงเบเป€เบฎเบปเบฒเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ MS SQL Server.

เป€เบ–เบดเบ‡เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบชเบญเบšเบ–เบฒเบก LINQ เบšเปเปˆเป„เบ”เป‰เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบฅเบฒเบเบฅเบฑเบเบญเบฑเบเบชเบญเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ” SQL เบชเบญเบšเบ–เบฒเบก, เป€เบŠเบดเปˆเบ‡ DBA เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบปเบšเบเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบ”เป‰เบงเบ nuances เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš SQL เบชเบญเบšเบ–เบฒเบก:

  1. เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ” (เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก) เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบเบฑเปˆเบ™โ€‹เบ•เบญเบ‡โ€‹เบœเบปเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบš (เบšเปˆเบญเบ™เบ—เบตเปˆ)
  2. nuances เบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เบเบธเปˆเบก
  3. เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบผเบฒเบเบขเปˆเบฒเบ‡เปƒเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ IN เบชเบธเบ” เบกเบตเบขเบนเปˆะธ เบšเปเปˆเบขเบนเปˆเปƒเบ™, <> เบชเบธเบ” เบกเบตเบขเบนเปˆ
  4. caching เบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡เบ‚เบญเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเบœเปˆเบฒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบง, CTE, เบ•เบปเบงเปเบ›เบ•เบฒเบ•เบฐเบฅเบฒเบ‡
  5. เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ›เบฐโ€‹เป‚เบซเบเบ (เบ—เบฒเบ‡เป€เบฅเบทเบญเบ) เบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปเบฅเบฐเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ เบเบฑเบš ()
  6. เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบเบฒเบ™โ€‹เป€เบšเบดเปˆเบ‡โ€‹เบ”เบฑเบ”โ€‹เบŠเบฐโ€‹เบ™เบตโ€‹เป€เบ›เบฑเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เปƒเบ™โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบเปเบฒโ€‹เบˆเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบญเปˆเบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบŠเปเป‰เบฒโ€‹เบŠเป‰เบญเบ™โ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบเบฒเบ™โ€‹เป€เบฅเบทเบญเบโ€‹

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš SQL เบชเบญเบšเบ–เบฒเบก เป€เบกเบทเปˆเบญเบฅเบงเบšเบฅเบงเบก เบชเบญเบšเบ–เบฒเบก LINQ เปเบกเปˆเบ™:

  1. เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบเบปเบ™เป„เบเบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบเบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบซเบ™เบถเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป
  2. duplicating blocks เบ”เบฝเบงเบเบฑเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”, เบŠเบถเปˆเบ‡เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบ™เปเบฒเป„เบ›เบชเบนเปˆเบเบฒเบ™เบญเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบซเบผเบฒเบ
  3. เบเบธเปˆเบกเบ‚เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบซเบผเบฒเบเบญเบปเบ‡เบ›เบฐเบเบญเบš (เป€เบซเบ”เบœเบปเบ™ "เปเบฅเบฐ" เปเบฅเบฐ "เบซเบผเบท") - เปเบฅเบฐ ะธ OR, เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™, เบ™เปเบฒเป„เบ›เบชเบนเปˆเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒ optimizer, เบกเบตเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบเบธเปˆเบกเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบ‚เบปเบ‡เป€เบ‚เบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบเปเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบชเบฐเปเบเบ™เบเบฑเบšเบ”เบฑเบ”เบŠเบฐเบ™เบต clustered (INDEX เบชเบฐเปเบเบ™) เป‚เบ”เบโ€‹เบเบธเปˆเบกโ€‹เบ‚เบญเบ‡โ€‹เป€เบ‡เบทเปˆเบญเบ™โ€‹เป„เบ‚โ€‹
  4. เบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบฑเบ‡เป€เบฅเบดเบเบ‚เบญเบ‡ subqueries เป€เบฎเบฑเบ”เปƒเบซเป‰ parsing เบกเบตเบšเบฑเบ™เบซเบฒเบซเบผเบฒเบ เบ„เบณเบ–เบฐเปเบซเบผเบ‡ SQL เปเบฅเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบœเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเปƒเบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐ DBA

เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบเป‰เบฒเบเป‚เบ”เบเบเบปเบ‡เป„เบ›เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš.

1) เบเบฒเบ™เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเป€เบžเบตเปˆเบกเป€เบ•เบตเบก

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ•เบปเบงเบเบญเบ‡เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบเบ•เบปเป‰เบ™เบ•เป, เป€เบžเบฒเบฐเบงเปˆเบฒเป€เบฅเบทเป‰เบญเบเป†เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบ›เบฐเบกเบฒเบ™เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบชเบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เบปเป‰เบ™เบ•เป (เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ - เบ›เบฐเบŠเบฒเบŠเบปเบ™ - เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™) เปเบฅเบฐเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ (IsClosed, Canceled, Enabled, Status). เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เบ•เบปเบงเบŠเบตเป‰เบงเบฑเบ”เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”.

เบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เบงเบฒเบกเบฎเบนเป‰เบชเบถเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฅเบทเบญเบเบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเปเบฒเบเบฑเบ”เบขเปˆเบฒเบ‡เปƒเบซเบเปˆเบซเบผเบงเบ‡เบ•เปเปˆเบŠเบธเบ”เบ—เบตเปˆเบชเบปเปˆเบ‡เบเบฑเบšเป„เบ›เบซเบฒเบ„เปเบฒเบ–เบฒเบก.

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบกเบต 500000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบกเบตเบžเบฝเบ‡เปเบ•เปˆ 2000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบตเปˆเป€เบฅเบทเบญเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เบˆเบฐเบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเบฒเบ INDEX เบชเบฐเปเบเบ™ เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปเบฅเบฐเบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบทเบญเบเบ‚เปเป‰เบกเบนเบ™เป„เบ”เป‰เป„เบงเป‚เบ”เบเบœเปˆเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบเบธเปˆเบก.

เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบเบฒเบ™เบ‚เบฒเบ”เบ”เบฑเบ”เบชเบฐเบ™เบตเบชเบฒเบกเบฒเบ”เบ–เบทเบเบฅเบฐเบšเบธเป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เป€เบ•เบทเบญเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบœเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบซเบผเบทเป€เบเบฑเบšเบเปเบฒเบชเบฐเบ–เบดเบ•เบดเบเบฒเบ™เป€เบšเบดเปˆเบ‡เบฅเบฐเบšเบปเบš. MS SQL Server:

  1. sys.dm_db_missing_index_groups
  2. sys.dm_db_missing_index_group_stats
  3. sys.dm_db_missing_index_details

เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบ—เบฑเบ‡เปเบปเบ”เบกเบตเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบตเปˆเบ‚เบฒเบ”เบซเบฒเบเป„เบ›, เบเบปเบเป€เบงเบฑเป‰เบ™เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบญเบ‡เบžเบทเป‰เบ™.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ”เบฑเบ”เบชเบฐเบ™เบตเปเบฅเบฐเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเบกเบฑเบเบˆเบฐเป€เบ›เบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ•เปเปˆเบชเบนเป‰เบเบฑเบšเบœเบปเบ™เบชเบฐเบ—เป‰เบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เบ—เบตเปˆเบšเปเปˆเบ”เบต เบชเบญเบšเบ–เบฒเบก LINQ ะธ SQL เบชเบญเบšเบ–เบฒเบก.

เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบฎเบธเบ™เปเบฎเบ‡เบ‚เบญเบ‡เบŠเบตเบงเบดเบ”เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™, เบกเบฑเบ™เบกเบฑเบเบˆเบฐเบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ—เบธเบฅเบฐเบเบดเบ”เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เป‚เบ”เบเบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™. เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบขเปˆเบฒเบ‡เบซเบ™เบฑเบเปเบกเปˆเบ™เบกเบฑเบเบˆเบฐเบ–เบทเบเป‚เบญเบ™เป„เบ›เบซเบฒเบžเบทเป‰เบ™เบซเบฅเบฑเบ‡เบ”เป‰เบงเบเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ.

เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบชเปˆเบงเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบœเบนเป‰เปƒเบŠเป‰เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบฅเป‰เบฒเบชเบธเบ”เบชเบฐเป€เบซเบกเบตเปเบฅเบฐเบกเบตเบฅเบฐเบ”เบฑเบšเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเป„เบ”เป‰.

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เปเบเป‰เป„เบ‚เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเบดเบ”, เปเบ•เปˆเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบเปเปˆเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ.

เบกเบฑเบ™เบเบฑเบ‡เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบเบฒเบ™เบˆเบทเปˆเบˆเปเบฒเบงเปˆเบฒเปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบก, เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ MS SQL เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบญเบฒเบ”เบˆเบฐเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡, เบฅเบงเบกเบ—เบฑเบ‡เบžเบฒเบเปƒเบ•เป‰เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบกเบตโ€‹เบ”เบฑเบ”โ€‹เบŠเบฐโ€‹เบ™เบตโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เป„เบงเป‰โ€‹เบ„เป‰เบฒเบโ€‹เบ„เบทโ€‹เบเบฑเบ™โ€‹เบ‚เบญเบ‡โ€‹เบžเบฒเบโ€‹เบชเบฐโ€‹เบซเบ™เบฒเบกโ€‹
  2. เบ–เป‰เบฒเบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ”เบฑเบ”เบชเบฐเบ™เบตเป„เบ”เป‰เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบต (เบญเบฐเบ—เบดเบšเบฒเบเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก เบ—เบตเปˆเบ™เบตเป‰).

2โ€‹) เบเบฒเบ™โ€‹เบฅเบงเบกโ€‹เบ„เบธเบ™โ€‹เบฅเบฑเบโ€‹เบชเบฐโ€‹เบ™เบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบ„เบธเบ™โ€‹เบฅเบฑเบโ€‹เบชเบฐโ€‹เบ™เบฐโ€‹เปƒเบซเบกเปˆโ€‹เบซเบ™เบถเปˆเบ‡โ€‹

เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบšเบฒเบ‡เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบ™เบถเปˆเบ‡, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบกเบ‚เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚, เบชเบฒเบกเบฒเบ”เบ–เบทเบเปเบ—เบ™เบ—เบตเปˆเป‚เบ”เบเบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเปƒเบซเบกเปˆ.

เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบš, เป€เบŠเบดเปˆเบ‡เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบˆเบฐเป€เบ›เบฑเบ™เบšเบดเบ”เบซเบผเบทเบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบกเปƒเบ™เบ›เบฐเป€เบžเบ”.

เบ•เบปเบงเบขเปˆเบฒเบ‡:

IsClosed = 0 AND Canceled = 0 AND Enabled = 0 เบ–เบทเบเปเบ—เบ™เบ—เบตเปˆเบ”เป‰เบงเบ เบชเบฐเบ–เบฒเบ™เบฐ = 1.

เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบš integer เบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เบ•เปเปˆเป„เบ›, เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเปƒเบซเบกเปˆเบ™เบตเป‰เบ–เบทเบเบ”เบฑเบ”เบชเบฐเบ™เบต.

เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบžเบทเป‰เบ™โ€‹เบ–เบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹, เป€เบžเบฒเบฐโ€‹เบงเปˆเบฒโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เป‚เบ”เบโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ„เบดเบ”โ€‹เป„เบฅเปˆโ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹.

3) เบงเบฑเบ”เบชเบฐเบ”เบธเบ‚เบญเบ‡เบ—เบฑเบ”เบชเบฐเบ™เบฐ

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เปƒเบ™ เบชเบญเบšเบ–เบฒเบก LINQ เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบŠเบปเปˆเบงเบ„เบฒเบง, CTEs, เปเบฅเบฐเบ•เบปเบงเปเบ›เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบเบปเบ‡.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบตเบงเบดเบ—เบตเบญเบทเปˆเบ™เบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบ™เบตเป‰ - indexed views .

เบเบธเปˆเบกเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ (เบˆเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡) IsClosed = 0 AND Canceled = 0 AND Enabled = 0 (เบซเบผเบทเบŠเบธเบ”เบ‚เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบญเบทเปˆเบ™เป†) เบเบฒเบเป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เปƒเบ™เบกเบธเบกเป€เบšเบดเปˆเบ‡เบ—เบตเปˆเบ–เบทเบเบ”เบฑเบ”เบชเบฐเบ™เบต, เบˆเบฑเบ”เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ™เป‰เบญเบเป†เบˆเบฒเบเบŠเบธเบ”เปƒเบซเบเปˆ.

เปเบ•เปˆเบกเบตเบ‚เปเป‰ เบˆเบณ เบเบฑเบ” เบˆเบณ เบ™เบงเบ™ เปœเบถเปˆเบ‡ เปƒเบ™เป€เบงเบฅเบฒเบชเป‰เบฒเบ‡เบ—เบฑเบ”เบชเบฐเบ™เบฐ:

  1. เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ‚เบญเบ‡ subqueriesโ€‹, เบ‚เปเป‰โ€‹ เบกเบตเบขเบนเปˆ เบ„เบงเบ™เบ–เบทเบเบ—เบปเบ”เปเบ—เบ™เป‚เบ”เบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก
  2. เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ UNION, เบชเบฐเบซเบฐเบžเบฑเบ™เบ—เบฑเบ‡ เปเบปเบ”, เบ‚เปเป‰โ€‹เบเบปเบโ€‹เป€เบงเบฑเป‰เบ™, เบ•เบฑเบ”เบเบฑเบ™
  3. เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐเบ‚เปเป‰ เบ—เบฒเบ‡เป€เบฅเบทเบญเบ
  4. เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบงเบปเบ‡เบˆเบญเบ™
  5. เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบกเบธเบกเป€เบšเบดเปˆเบ‡เบ”เบฝเบงเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบˆเบทเปˆเบˆเปเบฒเบงเปˆเบฒเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบกเบธเบกเป€เบšเบดเปˆเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเบงเบˆเบดเบ‡เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™.

เปเบ•เปˆเป€เบกเบทเปˆเบญเป‚เบ—เบซเบฒเบกเบธเบกเป€เบšเบดเปˆเบ‡, เบ”เบฑเบ”เบŠเบฐเบ™เบตเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เปเบฅเบฐเป€เบžเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธ. เบเบฑเบš(เบšเปเปˆเบ‚เบฐเบซเบเบฒเบ).

เบ•เบฑเป‰เบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™ เบชเบญเบšเบ–เบฒเบก LINQ เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบเปเบฒเบ™เบปเบ”เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบ•เบปเบงเปเบ—เบ™เบญเบทเปˆเบ™ - "wrapper" เบ‚เบญเบ‡เปเบšเบšเบŸเบญเบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

CREATE VIEW ะ˜ะœะฏ_ะฟั€ะตะดัั‚ะฐะฒะปะตะฝะธั AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);

4) เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡

เบกเบฑเบเบขเบนเปˆเปƒเบ™ เบชเบญเบšเบ–เบฒเบก LINQ เบ•เบฑเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ‚เบญเบ‡ subqueries เบซเบผเบทเบ•เบฑเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ views เบ—เบตเปˆเบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบ›เบฐเบเบญเบšเป€เบ›เบฑเบ™เบ„เปเบฒเบ–เบฒเบกเบชเบธเบ”เบ—เป‰เบฒเบเบ—เบตเปˆเบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบซเบผเบฒเบเปเบฅเบฐ suboptimal.

เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™ เบชเบญเบšเบ–เบฒเบก LINQ:

  1. เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบšเบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡ views, เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™เบงเบฑเบ”เบ–เบธ, เปเบ•เปˆเบงเปˆเบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบœเปˆเบฒเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™:
    เบˆเบฒเบ FUNCTION(@param1, @param2 ...)
    เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เป€เบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเป„เบ”เป‰
  2. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบšเปเปˆเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบ‚เบฑเป‰เบกเปเบ‚เบ‡เป€เบŠเบฑเปˆเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡:
    1. เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡:
      เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™ LINQ เบ—เปˆเบฒเบ™โ€‹เบšเปเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบฅเบฐโ€‹เบšเบธโ€‹เบงเปˆเบฒโ€‹เบ”เบฑเบ”โ€‹เบŠเบฐโ€‹เบ™เบตโ€‹เปƒเบ”โ€‹เบ„เบงเบ™โ€‹เบˆเบฐโ€‹เบ–เบทเบโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เปเบฅเบฐโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบเบฒเบ™โ€‹เปเบเบโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบชเบญเบšโ€‹เบ–เบฒเบกโ€‹.
      เปเบ•เปˆเบซเบ™เป‰เบฒเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰.
      เบ”เป‰เบงเบเบŸเบฑเบ‡เบŠเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเปเบœเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบปเบ‡เบ—เบตเปˆ, เบšเปˆเบญเบ™เบ—เบตเปˆเบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ”เบฑเบ”เบชเบฐเบ™เบตเปเบฅเบฐเบฅเบฐเบ”เบฑเบšเบเบฒเบ™เปเบเบเบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”.
    2. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰, เปƒเบ™เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเบกเบธเบกเป€เบšเบดเปˆเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบต, เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบš:
      • เป€เบซเบ”เบœเบปเบ™เบเบฒเบ™เป€เบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™ (เปเบกเป‰เปเบ•เปˆเปƒเบŠเป‰ loops)
      • เบ”เบถเบ‡เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบ
      • เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ‚เบญเบ‡ UNION ะธ เบกเบตเบขเบนเปˆ

  3. เบ‚เปเป‰เบชเบฐ เป€เปœเบต เบ—เบฒเบ‡เป€เบฅเบทเบญเบ เบกเบตเบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบเป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบ„เบงเบฒเบกเบชเบญเบ”เบ„เปˆเบญเบ‡เบเบฑเบ™ OPTION(MAXDOP N), เบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เบญเบ‡เปเบœเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก. เบเบปเบโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡:
    • เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เบชเป‰เบฒเบ‡เปเบœเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ„เบทเบ™เปƒเบซเบกเปˆ เบ•เบปเบงเป€เบฅเบทเบญเบ (เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™)
    • เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบˆเบฐเบšเบฑเบ‡เบ„เบฑเบšเปเบœเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเป€เบžเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบ„เปเบฒเบ–เบฒเบก เบ•เบปเบงเป€เบฅเบทเบญเบ (เบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เบชเบฑเปˆเบ‡)

    เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบš เบ—เบฒเบ‡เป€เบฅเบทเบญเบ เบญเบฐเบ—เบดเบšเบฒเบ เบ—เบตเปˆเบ™เบตเป‰.

  4. เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เปเบ„เบšโ€‹เบ—เบตเปˆโ€‹เบชเบธเบ”โ€‹เปเบฅเบฐโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบชเบธเบ”โ€‹:
    เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปƒเบ™เบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ (เบ„เบทเบเบฑเบ™เบเบฑเบšเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบตเบกเบธเบกเป€เบšเบดเปˆเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบต), เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต.
    เบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบ•เบปเบงเบเบญเบ‡ เบšเปˆเบญเบ™เบ—เบตเปˆ เบชเบฒเบกเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ (a, b, c).

    เบ•เบฒเบกเบ—เปเบฒเบกเบฐเบ”เบฒ, เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ„เบปเบ‡เบ—เบตเปˆ a = 0 เปเบฅเบฐ b = 0.

    เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบชเปเบฒเบฅเบฑเบšเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก c เบ•เบปเบงโ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เบซเบผเบฒเบโ€‹เบเบงเปˆเบฒโ€‹.

    เปƒเบซเป‰เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ a = 0 เปเบฅเบฐ b = 0 เบกเบฑเบ™เบเปเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เป€เบ›เบฑเบ™เบžเบฑเบ™เป†เบšเบฑเบ™เบ—เบถเบ, เปเบ•เปˆเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปƒเบ™ ั เบˆเบณเบเบฑเบ”เบเบฒเบ™เป€เบฅเบทเบญเบเบฅเบปเบ‡เป€เบ›เบฑเบ™เบฎเป‰เบญเบเบšเบฑเบ™เบ—เบถเบ.

    เบ—เบตเปˆเบ™เบตเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒ.

    เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบŸเบฑเบ‡เบŠเบฑเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบกเปˆเบ™เบชเบฒเบกเบฒเบ”เบ„เบฒเบ”เป€เบ”เบปเบฒเป„เบ”เป‰เบซเบผเบฒเบเบ‚เบถเป‰เบ™เปเบฅเบฐเบชเบญเบ”เบ„เปˆเบญเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”.

เบ•เบปเบงเบขเปˆเบฒเบ‡

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ„เปเบฒเบ–เบฒเบกเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡.

เบกเบตเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป SELECT, เป€เบŠเบดเปˆเบ‡เบฅเบงเบกเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบผเบฒเบเปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบซเบ™เบถเปˆเบ‡เป€เบšเบดเปˆเบ‡ (OperativeQuestions), เป€เบŠเบดเปˆเบ‡เบ„เบงเบฒเบกเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เป„เบ”เป‰เบ–เบทเบเบเบงเบ”เบชเบญเบšเป‚เบ”เบเบญเบตเป€เบกเบฅเปŒ (เบœเปˆเบฒเบ™ เบกเบตเบขเบนเปˆ) เบเบฑเบš "เบ„เปเบฒเบ–เบฒเบกเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™":

เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบ 1โ€‹

(@p__linq__0 nvarchar(4000))SELECT
1 AS [C1],
[Extent1].[Id] AS [Id],
[Join2].[Object_Id] AS [Object_Id],
[Join2].[ObjectType_Id] AS [ObjectType_Id],
[Join2].[Name] AS [Name],
[Join2].[ExternalId] AS [ExternalId]
FROM [dbo].[Questions] AS [Extent1]
INNER JOIN (SELECT [Extent2].[Object_Id] AS [Object_Id],
[Extent2].[Question_Id] AS [Question_Id], [Extent3].[ExternalId] AS [ExternalId],
[Extent3].[ObjectType_Id] AS [ObjectType_Id], [Extent4].[Name] AS [Name]
FROM [dbo].[ObjectQuestions] AS [Extent2]
INNER JOIN [dbo].[Objects] AS [Extent3] ON [Extent2].[Object_Id] = [Extent3].[Id]
LEFT OUTER JOIN [dbo].[ObjectTypes] AS [Extent4] 
ON [Extent3].[ObjectType_Id] = [Extent4].[Id] ) AS [Join2] 
ON [Extent1].[Id] = [Join2].[Question_Id]
WHERE ([Extent1].[AnswerId] IS NULL) AND (0 = [Extent1].[Exp]) AND ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[OperativeQuestions] AS [Extent5]
WHERE (([Extent5].[Email] = @p__linq__0) OR (([Extent5].[Email] IS NULL) 
AND (@p__linq__0 IS NULL))) AND ([Extent5].[Id] = [Extent1].[Id])
));

เบกเบธเบกเป€เบšเบดเปˆเบ‡เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ: เบกเบฑเบ™เบกเบต subquery เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบˆเบฑเบ”เบฅเบฝเบ‡ DISTINCT, เป€เบŠเบดเปˆเบ‡เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบงเปเบกเปˆเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ—เบตเปˆเบกเบตเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฒเบ OperativeQuestions เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™เบชเบดเบšเบžเบฑเบ™เบšเบฑเบ™เบ—เบถเบ.

เบšเบฑเบ™เบซเบฒเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ™เบตเป‰เปเบกเปˆเบ™เบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบˆเบฒเบเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบžเบฒเบเบ™เบญเบ, เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบเปˆเบญเบเบžเบฒเบเปƒเบ™เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบกเบธเบกเป€เบšเบดเปˆเบ‡ [OperativeQuestions], เป€เบŠเบดเปˆเบ‡เบ„เบงเบ™เบชเปเบฒเบฅเบฑเบš [Email] = @p__linq__0 เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบฅเบทเบญเบเบœเบปเบ™เบœเบฐเบฅเบดเบ” (เบœเปˆเบฒเบ™ เบกเบตเบขเบนเปˆ) เป€เบ–เบดเบ‡เบซเบผเบฒเบเบฎเป‰เบญเบเบšเบฑเบ™เบ—เบถเบ.

เปเบฅเบฐเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ subquery เบ„เบงเบ™เบ„เบดเบ”เป„เบฅเปˆเบšเบฑเบ™เบ—เบถเบเบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡เป‚เบ”เบ [Email] = @p__linq__0, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเบญเบ‡เบชเบฒเบกเบฎเป‰เบญเบเบšเบฑเบ™เบ—เบถเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเบ–เบทเบเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบ Id เบเบฑเบšเบ„เปเบฒเบ–เบฒเบก, เปเบฅเบฐเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบˆเบฐเป„เบง.

เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”: เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบ™เบ•เบญเบšเบ„เปเบฒเบ–เบฒเบกเบ‚เบญเบ‡ Id เบเบฑเบš Id เบˆเบฒเบ OperativeQuestions, เปเบฅเบฐเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป‚เบ”เบเบญเบตเป€เบกเบง.

เปƒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เป€เบ›เบฑเบ™โ€‹เบˆเบดเบ‡, เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบฎเปˆเบงเบกโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบชเบดเบšโ€‹เบžเบฑเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เบ„เปเบฒโ€‹เบ–เบฒเบก Operative, เปเบ•เปˆโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เปเบกเปˆเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบœเปˆเบฒเบ™ Email.

เบ„เปเบฒเบ–เบฒเบกเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เป€เบšเบดเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก:

เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบ 2โ€‹

 
CREATE VIEW [dbo].[OperativeQuestions]
AS
SELECT DISTINCT Q.Id, USR.email AS Email
FROM            [dbo].Questions AS Q INNER JOIN
                         [dbo].ProcessUserAccesses AS BPU ON BPU.ProcessId = CQ.Process_Id 
OUTER APPLY
                     (SELECT   1 AS HasNoObjects
                      WHERE   NOT EXISTS
                                    (SELECT   1
                                     FROM     [dbo].ObjectUserAccesses AS BOU
                                     WHERE   BOU.ProcessUserAccessId = BPU.[Id] AND BOU.[To] IS NULL)
) AS BO INNER JOIN
                         [dbo].Users AS USR ON USR.Id = BPU.UserId
WHERE        CQ.[Exp] = 0 AND CQ.AnswerId IS NULL AND BPU.[To] IS NULL 
AND (BO.HasNoObjects = 1 OR
              EXISTS (SELECT   1
                           FROM   [dbo].ObjectUserAccesses AS BOU INNER JOIN
                                      [dbo].ObjectQuestions AS QBO 
                                                  ON QBO.[Object_Id] =BOU.ObjectId
                               WHERE  BOU.ProcessUserAccessId = BPU.Id 
                               AND BOU.[To] IS NULL AND QBO.Question_Id = CQ.Id));

เปเบœเบ™เบ—เบตเปˆเบกเบธเบกเบกเบญเบ‡เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปƒเบ™ DbContext (EF Core 2)

public class QuestionsDbContext : DbContext
{
    //...
    public DbQuery<OperativeQuestion> OperativeQuestions { get; set; }
    //...
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Query<OperativeQuestion>().ToView("OperativeQuestions");
    }
}

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™

var businessObjectsData = await context
    .OperativeQuestions
    .Where(x => x.Email == Email)
    .Include(x => x.Question)
    .Select(x => x.Question)
    .SelectMany(x => x.ObjectQuestions,
                (x, bo) => new
                {
                    Id = x.Id,
                    ObjectId = bo.Object.Id,
                    ObjectTypeId = bo.Object.ObjectType.Id,
                    ObjectTypeName = bo.Object.ObjectType.Name,
                    ObjectExternalId = bo.Object.ExternalId
                })
    .ToListAsync();

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบกเบตเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบก ("เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง"), เป€เบŠเบดเปˆเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบปเบ™เป„เบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบฎเบฑเบเบชเบฒเบกเบฑเบ™เปƒเบซเป‰เบ—เบฑเบ™เบชเบฐเป„เบซเบก. .

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบต, เบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบญเบทเปˆเบ™เบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบšเบฑเบ™เบซเบฒเบ™เบตเป‰.

เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เป€เบžเบทเปˆเบญ cache entries เป‚เบ”เบ [Email] = @p__linq__0 เบˆเบฒเบ OperativeQuestions view.

เปเบ™เบฐเบ™เปเบฒเบŸเบฑเบ‡เบŠเบฑเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ [dbo].[OperativeQuestionsUserMail] เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบชเบปเปˆเบ‡โ€‹เบญเบตโ€‹เป€เบกเบงโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เบปเบงโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™โ€‹เบ›เป‰เบญเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹, เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เบกเบฒโ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบ„เบธเบ™โ€‹เบ„เปˆเบฒโ€‹:

เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบ 3โ€‹


CREATE FUNCTION [dbo].[OperativeQuestionsUserMail]
(
    @Email  nvarchar(4000)
)
RETURNS
@tbl TABLE
(
    [Id]           uniqueidentifier,
    [Email]      nvarchar(4000)
)
AS
BEGIN
        INSERT INTO @tbl ([Id], [Email])
        SELECT Id, @Email
        FROM [OperativeQuestions]  AS [x] WHERE [x].[Email] = @Email;
     
    RETURN;
END

เบ™เบตเป‰เบชเบปเปˆเบ‡เบ„เบทเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบญเบ‡เบ„เปˆเบฒเบ—เบตเปˆเบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบเปˆเบญเบ™.

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบเบฑเบš OperativeQuestionsUserMail เบ”เบตเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบกเบตเปเบœเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”, เบ•เป‰เบญเบ‡เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเป€เบ„เบฑเปˆเบ‡เบ„เบฑเบ”, เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™. เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเบปเปˆเบ‡เบ„เบทเบ™เบ•เบฒเบกเบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™...

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, Query 1 เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเบฐเบ–เบทเบเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ Query 4:

เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบ 4โ€‹

(@p__linq__0 nvarchar(4000))SELECT
1 AS [C1],
[Extent1].[Id] AS [Id],
[Join2].[Object_Id] AS [Object_Id],
[Join2].[ObjectType_Id] AS [ObjectType_Id],
[Join2].[Name] AS [Name],
[Join2].[ExternalId] AS [ExternalId]
FROM (
    SELECT Id, Email FROM [dbo].[OperativeQuestionsUserMail] (@p__linq__0)
) AS [Extent0]
INNER JOIN [dbo].[Questions] AS [Extent1] ON([Extent0].Id=[Extent1].Id)
INNER JOIN (SELECT [Extent2].[Object_Id] AS [Object_Id], [Extent2].[Question_Id] AS [Question_Id], [Extent3].[ExternalId] AS [ExternalId], [Extent3].[ObjectType_Id] AS [ObjectType_Id], [Extent4].[Name] AS [Name]
FROM [dbo].[ObjectQuestions] AS [Extent2]
INNER JOIN [dbo].[Objects] AS [Extent3] ON [Extent2].[Object_Id] = [Extent3].[Id]
LEFT OUTER JOIN [dbo].[ObjectTypes] AS [Extent4] 
ON [Extent3].[ObjectType_Id] = [Extent4].[Id] ) AS [Join2] 
ON [Extent1].[Id] = [Join2].[Question_Id]
WHERE ([Extent1].[AnswerId] IS NULL) AND (0 = [Extent1].[Exp]);

เปเบœเบ™เบ—เบตเปˆเบกเบธเบกเป€เบšเบดเปˆเบ‡ เปเบฅเบฐเบŸเบฑเบ‡เบŠเบฑเบ™เปƒเบ™ DbContext (EF Core 2)

public class QuestionsDbContext : DbContext
{
    //...
    public DbQuery<OperativeQuestion> OperativeQuestions { get; set; }
    //...
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Query<OperativeQuestion>().ToView("OperativeQuestions");
    }
}
 
public static class FromSqlQueries
{
    public static IQueryable<OperativeQuestion> GetByUserEmail(this DbQuery<OperativeQuestion> source, string Email)
        => source.FromSql($"SELECT Id, Email FROM [dbo].[OperativeQuestionsUserMail] ({Email})");
}

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก LINQ เบชเบธเบ”เบ—เป‰เบฒเบ

var businessObjectsData = await context
    .OperativeQuestions
    .GetByUserEmail(Email)
    .Include(x => x.Question)
    .Select(x => x.Question)
    .SelectMany(x => x.ObjectQuestions,
                (x, bo) => new
                {
                    Id = x.Id,
                    ObjectId = bo.Object.Id,
                    ObjectTypeId = bo.Object.ObjectType.Id,
                    ObjectTypeName = bo.Object.ObjectType.Name,
                    ObjectExternalId = bo.Object.ExternalId
                })
    .ToListAsync();

เบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เบญเบ‡เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบซเบผเบธเบ”เบฅเบปเบ‡เบˆเบฒเบ 200-800 ms, เป€เบ›เบฑเบ™ 2-20 ms, เปเบฅเบฐเบญเบทเปˆเบ™เป†, i.e. เบซเบผเบฒเบเบชเบดเบšเป€เบ—เบทเปˆเบญเป„เบง.

เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบกเบฑเบ™เป‚เบ”เบเบชเบฐเป€เบฅเปˆเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ 350 ms เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš 8 ms.

เบˆเบฒเบเบ‚เปเป‰เป„เบ”เป‰เบ›เบฝเบšเบ—เบตเปˆเบˆเบฐเปเบˆเป‰เบ‡เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เป„เบ”เป‰เบฎเบฑเบš:

  1. เบเบฒเบ™โ€‹เบซเบผเบธเบ”โ€‹เบœเปˆเบญเบ™โ€‹เบเบฒเบ™โ€‹เบญเปˆเบฒเบ™โ€‹เบซเบ™เบฑเบ‡โ€‹เบชเบทโ€‹เป‚เบ”เบโ€‹เบ—เบปเปˆเบงโ€‹เป„เบ›โ€‹,
  2. เบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡
  3. เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบชเบฐเบเบฑเบ”เบชเบฐเป€เบฅเปˆเบเป„เบ›เบชเบนเปˆเบ„เปˆเบฒเบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเป„เบ”เป‰

เบชเบฐเบซเบฅเบธเบš

เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปเบฅเบฐเบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ MS SQL เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™ LINQ เป€เบ›เบฑเบ™โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบ—เบตเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เป„เบ”เป‰โ€‹.

เบ„เบงเบฒเบกเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเปเบฅเบฐเบ„เบงเบฒเบกเบชเบญเบ”เบ„เปˆเบญเบ‡เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบเปƒเบ™เบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰.

เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™:

  1. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบเบงเบ”เบเบฒเป€เบšเบดเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบฎเป‰เบญเบ‡เบ‚เปเป€เบฎเบฑเบ”เบงเบฝเบ (เบ„เปˆเบฒ, เบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบฅเบทเบญเบ)
  2. เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบตเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡
  3. เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡

เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบงเปˆเบฒโ€‹:

  1. เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เบปเป‰เบ™เบ•เป
  2. เป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบ„เบทเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปเบฅเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบˆเบธเบ”เบ•เบฑเบ”เบเบฑเบ™เบ‚เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚
  3. เปƒเบ™ SSMS เบซเบผเบท GUI เบญเบทเปˆเบ™เป†เบชเปเบฒเบฅเบฑเบš SQL Server optimizes เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡ SQL เบชเบญเบšเบ–เบฒเบก (เบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡, เบชเป‰เบฒเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ™เบตเป‰ (เบญเบฒเบ”เบกเบตเบซเบผเบฒเบ))
  4. เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบชเบธเบ”เบ—เป‰เบฒเบ, เปƒเบŠเป‰เป€เบงเบฅเบฒเป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš SQL เบชเบญเบšเบ–เบฒเบก, เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบเปเบฒเบฅเบฑเบ‡เบ–เบทเบเบชเป‰เบฒเบ‡เปƒเบซเบกเปˆ LINQ เบชเบญเบšเบ–เบฒเบก

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš LINQ เบชเบญเบšเบ–เบฒเบก เบ„เบงเบ™โ€‹เบˆเบฐโ€‹เบเบฒเบโ€‹เป€เบ›เบฑเบ™โ€‹เป‚เบ„เบ‡โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบ”เบตโ€‹เบ—เบตเปˆโ€‹เบชเบธเบ”โ€‹เบ—เบตเปˆโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เป„เบงเป‰โ€‹ SQL เบชเบญเบšเบ–เบฒเบก เบˆเบฒเบเบˆเบธเบ” 3.

เบ‚เบญเบšเปƒเบˆ

เบ‚เบญเบšเปƒเบˆเบซเบผเบฒเบเป†เบเบฑเบšเป€เบžเบทเปˆเบญเบ™เบฎเปˆเบงเบกเบ‡เบฒเบ™ เบงเบฝเบเป€เบฎเบฑเบ”เบ‡เบฒเบ™เบ—เบณ ะธ alex_ozr เบˆเบฒเบเบšเปเบฅเบดเบชเบฑเบ” Fortis เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเปƒเบ™เบเบฒเบ™เบเบฐเบเบฝเบกเป€เบญเบเบฐเบชเบฒเบ™เบ™เบตเป‰.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™