ืฉื™ื˜ื•ืช ืœืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืฉืื™ืœืชื•ืช LINQ ื‘-C#.NET

ืžื‘ื•ื

ะ’ ืžืืžืจ ื–ื” ื ื‘ืงืœื• ื›ืžื” ืฉื™ื˜ื•ืช ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืื™ืœืชื•ืช LINQ.
ื›ืืŸ ืื ื• ืžืฆื™ื’ื™ื ื’ื ื›ืžื” ื’ื™ืฉื•ืช ื ื•ืกืคื•ืช ืœืžื™ื˜ื•ื‘ ืงื•ื“ ื”ืงืฉื•ืจื•ืช ืฉืื™ืœืชื•ืช LINQ.

ื–ื” ื™ื“ื•ืข ื›ื™ LINQ(ืฉืื™ืœืชื” ืžืฉื•ืœื‘ืช ื‘ืฉืคื”) ื”ื™ื ืฉืคื” ืคืฉื•ื˜ื” ื•ื ื•ื—ื” ืœืฉืื™ืœืชื” ืฉืœ ืžืงื•ืจ ื ืชื•ื ื™ื.

ะ LINQ ืœ- SQL ื”ื™ื ื˜ื›ื ื•ืœื•ื’ื™ื” ืœื’ื™ืฉื” ืœื ืชื•ื ื™ื ื‘-DBMS. ื–ื”ื• ื›ืœื™ ืจื‘ ืขื•ืฆืžื” ืœืขื‘ื•ื“ื” ืขื ื ืชื•ื ื™ื, ืฉื‘ื• ืฉืื™ืœืชื•ืช ื ื‘ื ื•ืช ื‘ืืžืฆืขื•ืช ืฉืคื” ื”ืฆื”ืจืชื™ืช, ืืฉืจ ืœืื—ืจ ืžื›ืŸ ืชื•ืžืจ ืœ- ืฉืื™ืœืชื•ืช SQL ืคืœื˜ืคื•ืจืžื” ื•ื ืฉืœื— ืœืฉืจืช ืžืกื“ ื”ื ืชื•ื ื™ื ืœื‘ื™ืฆื•ืข. ื‘ืžืงืจื” ืฉืœื ื•, ื‘-DBMS ืื ื—ื ื• ืžืชื›ื•ื•ื ื™ื MS SQL Server.

ืขื ื–ืืช, ืฉืื™ืœืชื•ืช LINQ ืื™ื ื ืžื•ืžืจื™ื ืœื›ืชื•ื‘ื™ื ื‘ืฆื•ืจื” ืžื™ื˜ื‘ื™ืช ืฉืื™ืœืชื•ืช SQL, ืฉ-DBA ืžื ื•ืกื” ื™ื•ื›ืœ ืœื›ืชื•ื‘ ืขื ื›ืœ ื”ื ื™ื•ืื ืกื™ื ืฉืœ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืื™ืœืชื•ืช SQL:

  1. ื—ื™ื‘ื•ืจื™ื ืื•ืคื˜ื™ืžืœื™ื™ื (ืœื”ืฆื˜ืจืฃ) ื•ืกื™ื ื•ืŸ ื”ืชื•ืฆืื•ืช (ืื™ืคื”)
  2. ื ื™ื•ืื ืกื™ื ืจื‘ื™ื ื‘ืฉื™ืžื•ืฉ ื‘ืงืฉืจื™ื ื•ื‘ืชื ืื™ื ืงื‘ื•ืฆืชื™ื™ื
  3. ื•ืจื™ืืฆื™ื•ืช ืจื‘ื•ืช ื‘ื”ื—ืœืคืช ืชื ืื™ื IN ืขืœ EXISTSะธ ืœื ื‘, <> ืคื•ืขืœ EXISTS
  4. ืžื˜ืžื•ืŸ ื‘ื™ื ื™ื™ื ืฉืœ ืชื•ืฆืื•ืช ื‘ืืžืฆืขื•ืช ื˜ื‘ืœืื•ืช ื–ืžื ื™ื•ืช, CTE, ืžืฉืชื ื™ ื˜ื‘ืœื”
  5. ืฉื™ืžื•ืฉ ื‘ืžืฉืคื˜ (ืื•ึนืคึผึฐืฆึดื™ึธื”) ืขื ื”ื•ืจืื•ืช ื•ืจืžื–ื™ื ืœื˜ื‘ืœื” ืขึดื (...)
  6. ืฉื™ืžื•ืฉ ื‘ืชืฆื•ื’ื•ืช ืื™ื ื“ืงืก ื›ืื—ื“ ื”ืืžืฆืขื™ื ืœื”ื™ืคื˜ืจ ืžืงืจื™ืื•ืช ื ืชื•ื ื™ื ืžื™ื•ืชืจื•ืช ื‘ืžื”ืœืš ื‘ื—ื™ืจื•ืช

ืฆื•ื•ืืจื™ ื”ื‘ืงื‘ื•ืง ื”ืขื™ืงืจื™ื™ื ืฉืœ ื”ื‘ื™ืฆื•ืขื™ื ื”ืžืชืงื‘ืœื™ื ืฉืื™ืœืชื•ืช SQL ื‘ืขืช ื”ื™ื“ื•ืจ ืฉืื™ืœืชื•ืช LINQ ื”ื:

  1. ืื™ื—ื•ื“ ืฉืœ ื›ืœ ืžื ื’ื ื•ืŸ ื‘ื—ื™ืจืช ื”ื ืชื•ื ื™ื ื‘ื‘ืงืฉื” ืื—ืช
  2. ืฉื›ืคื•ืœ ื‘ืœื•ืงื™ื ื–ื”ื™ื ืฉืœ ืงื•ื“, ืžื” ืฉืžื•ื‘ื™ืœ ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ืœืงืจื™ืื•ืช ื ืชื•ื ื™ื ืžื™ื•ืชืจื•ืช ืžืจื•ื‘ื•ืช
  3. ืงื‘ื•ืฆื•ืช ืฉืœ ืชื ืื™ื ืžืจื•ื‘ื™ ืจื›ื™ื‘ื™ื ("ื•" ื•"ืื•" ืœื•ื’ื™ื™ื) - ื• ะธ OR, ืฉื™ืœื•ื‘ ืœืชื ืื™ื ืžื•ืจื›ื‘ื™ื, ืžื•ื‘ื™ืœ ืœืขื•ื‘ื“ื” ืฉื”ืื•ืคื˜ื™ืžื™ื–ืจ, ื‘ืขืœ ืื™ื ื“ืงืกื™ื ืœื ืžืงื•ื‘ืฆื™ื ืžืชืื™ืžื™ื ืœืฉื“ื•ืช ื”ื“ืจื•ืฉื™ื, ืžืชื—ื™ืœ ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ืœืกืจื•ืง ื›ื ื’ื“ ื”ืื™ื ื“ืงืก ื”ืžืงื•ื‘ืฅ (ืกืจื™ืงืช ืื™ื ื“ืงืก) ืœืคื™ ืงื‘ื•ืฆื•ืช ืฉืœ ืชื ืื™ื
  4. ืงื™ื ื•ืŸ ืขืžื•ืง ืฉืœ ืฉืื™ืœืชื•ืช ืžืฉื ื” ื”ื•ืคืš ืืช ื”ื ื™ืชื•ื— ืœื‘ืขื™ื™ืชื™ ืžืื•ื“ ื”ืฆื”ืจื•ืช SQL ื•ื ื™ืชื•ื— ืชื•ื›ื ื™ืช ื”ืฉืื™ืœืชื•ืช ืžืฆื“ ืžืคืชื—ื™ื ื• DBA

ืฉื™ื˜ื•ืช ืžื™ื˜ื•ื‘

ื›ืขืช ื ืขื‘ื•ืจ ื™ืฉื™ืจื•ืช ืœืฉื™ื˜ื•ืช ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”.

1) ื”ื•ืกืคื” ืœืื™ื ื“ืงืก

ืขื“ื™ืฃ ืœืฉืงื•ืœ ืžืกื ื ื™ื ื‘ื˜ื‘ืœืื•ืช ื”ื‘ื—ื™ืจื” ื”ืจืืฉื™ื•ืช, ืžื›ื™ื•ื•ืŸ ืฉืœืขืชื™ื ืงืจื•ื‘ื•ืช ื›ืœ ื”ืฉืื™ืœืชื” ื‘ื ื•ื™ื” ืกื‘ื™ื‘ ื˜ื‘ืœื” ืจืืฉื™ืช ืื—ืช ืื• ืฉืชื™ื™ื (ืืคืœื™ืงืฆื™ื•ืช-ืื ืฉื™ื-ืคืขื•ืœื•ืช) ื•ืขื ืžืขืจื›ืช ืกื˜ื ื“ืจื˜ื™ืช ืฉืœ ืชื ืื™ื (IsClosed, Canceled, Enabled, Status). ื—ืฉื•ื‘ ืœื™ืฆื•ืจ ืžื“ื“ื™ื ืžืชืื™ืžื™ื ืœื“ื’ื™ืžื•ืช ืฉื–ื•ื”ื•.

ืคืชืจื•ืŸ ื–ื” ื”ื’ื™ื•ื ื™ ื›ืืฉืจ ื‘ื—ื™ืจื” ื‘ืฉื“ื•ืช ืืœื• ืžื’ื‘ื™ืœื” ื‘ืื•ืคืŸ ืžืฉืžืขื•ืชื™ ืืช ื”ืกื˜ ื”ืžื•ื—ื–ืจ ืœืฉืื™ืœืชื”.

ืœื“ื•ื’ืžื”, ื™ืฉ ืœื ื• 500000 ื™ื™ืฉื•ืžื™ื. ืขื ื–ืืช, ื™ืฉ ืจืง 2000 ื™ื™ืฉื•ืžื™ื ืคืขื™ืœื™ื. ื•ืื– ืื™ื ื“ืงืก ืฉื ื‘ื—ืจ ื ื›ื•ืŸ ื™ืฆื™ืœ ืื•ืชื ื• ืกืจื™ืงืช ืื™ื ื“ืงืก ืขืœ ื˜ื‘ืœื” ื’ื“ื•ืœื” ื•ื™ืืคืฉืจ ืœืš ืœื‘ื—ื•ืจ ื ืชื•ื ื™ื ื‘ืžื”ื™ืจื•ืช ื‘ืืžืฆืขื•ืช ืื™ื ื“ืงืก ืœื ืžืงื•ื‘ืฅ.

ื›ืžื• ื›ืŸ, ื ื™ืชืŸ ืœื–ื”ื•ืช ืืช ื”ื™ืขื“ืจ ื”ืื™ื ื“ืงืกื™ื ื‘ืืžืฆืขื•ืช ื”ื ื—ื™ื•ืช ืœื ื™ืชื•ื— ืชื•ื›ื ื™ื•ืช ืฉืื™ืœืชื•ืช ืื• ืื™ืกื•ืฃ ืกื˜ื˜ื™ืกื˜ื™ืงื•ืช ืฉืœ ืชืฆื•ื’ื•ืช ืžืขืจื›ืช 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.

ื›ืคื™ ืฉืžืจืื” ื”ืชืจื’ื•ืœ ื”ืงืฉื” ืฉืœ ื”ื—ื™ื™ื, ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื—ืฉื•ื‘ ืœืขืกืง ืœื™ื™ืฉื ืชื›ื•ื ื•ืช ืขืกืงื™ื•ืช ื‘ืžื•ืขื“ื™ื ืžืกื•ื™ืžื™ื. ื•ืœื›ืŸ, ื‘ืงืฉื•ืช ื›ื‘ื“ื•ืช ืžื•ืขื‘ืจื•ืช ืœืจื•ื‘ ืœืจืงืข ืขื ืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ.

ื–ื” ืžื•ืฆื“ืง ื‘ื—ืœืงื•, ืžื›ื™ื•ื•ืŸ ืฉื”ืžืฉืชืžืฉ ืœื ืชืžื™ื“ ืฆืจื™ืš ืืช ื”ื ืชื•ื ื™ื ื”ืขื“ื›ื ื™ื™ื ื‘ื™ื•ืชืจ ื•ื™ืฉ ืจืžืช ืชื’ื•ื‘ื” ืžืงื•ื‘ืœืช ืฉืœ ืžืžืฉืง ื”ืžืฉืชืžืฉ.

ื’ื™ืฉื” ื–ื• ืžืืคืฉืจืช ืคืชืจื•ืŸ ืฆืจื›ื™ื ืขืกืงื™ื™ื, ืืš ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ืžืคื—ื™ืชื” ืืช ื‘ื™ืฆื•ืขื™ ืžืขืจื›ืช ื”ืžื™ื“ืข ืขืœ ื™ื“ื™ ืขื™ื›ื•ื‘ ืคืชืจื•ื ื•ืช ืœื‘ืขื™ื•ืช ืคืฉื•ื˜.

ื›ื“ืื™ ื’ื ืœื–ื›ื•ืจ ืฉื‘ืชื”ืœื™ืš ื”ื—ื™ืคื•ืฉ ืื—ืจ ื”ืื™ื ื“ืงืกื™ื ื”ื“ืจื•ืฉื™ื ืœื”ื•ืกื™ืฃ, ื”ืฆืขื•ืช SQL MS ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืขืฉื•ื™ื” ืœื”ื™ื•ืช ืฉื’ื•ื™ื”, ื›ื•ืœืœ ื‘ืชื ืื™ื ื”ื‘ืื™ื:

  1. ืื ื›ื‘ืจ ื™ืฉ ืื™ื ื“ืงืกื™ื ืขื ืงื‘ื•ืฆื” ื“ื•ืžื” ืฉืœ ืฉื“ื•ืช
  2. ืื ื”ืฉื“ื•ืช ื‘ื˜ื‘ืœื” ืื™ื ื ื ื™ืชื ื™ื ืœืื™ื ื“ืงืก ืขืงื‘ ืžื’ื‘ืœื•ืช ื”ื•ืกืคื” ืœืื™ื ื“ืงืก (ืžืชื•ืืจ ื‘ืคื™ืจื•ื˜ ืจื‘ ื™ื•ืชืจ ื›ืืŸ).

2) ืžื™ื–ื•ื’ ืชื›ื•ื ื•ืช ืœืชื›ื•ื ื” ื—ื“ืฉื” ืื—ืช

ืœืคืขืžื™ื ื ื™ืชืŸ ืœื”ื—ืœื™ืฃ ื›ืžื” ืฉื“ื•ืช ืžื˜ื‘ืœื” ืื—ืช, ื”ืžืฉืžืฉื™ื ื‘ืกื™ืก ืœืงื‘ื•ืฆืช ืชื ืื™ื, ืขืœ ื™ื“ื™ ื”ื›ื ืกืช ืฉื“ื” ื—ื“ืฉ ืื—ื“.

ื–ื” ื ื›ื•ืŸ ื‘ืžื™ื•ื—ื“ ืขื‘ื•ืจ ืฉื“ื•ืช ืกื˜ื˜ื•ืก, ืฉื”ื ื‘ื“ืจืš ื›ืœืœ ื‘ื™ื˜ ืื• ืžืกืคืจ ืฉืœื.

ืœื“ื•ื’ืžื”:

IsClosed = 0 AND Cancelled = 0 ื•-Enabled = 0 ื”ื•ื—ืœืฃ ืขืœ ื™ื“ื™ ืกื˜ื˜ื•ืก = 1.

ื›ืืŸ ืžื•ืฆื’ืช ืชื›ื•ื ืช ื”ืžืฆื‘ ื”ืฉืœื ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉื”ืกื˜ื˜ื•ืกื™ื ื”ืืœื” ืžืื•ื›ืœืกื™ื ื‘ื˜ื‘ืœื”. ืœืื—ืจ ืžื›ืŸ, ื”ืชื›ื•ื ื” ื”ื—ื“ืฉื” ื”ื–ื• ืžืชื•ื•ืกืคืช ืœืื™ื ื“ืงืก.

ื–ื”ื• ืคืชืจื•ืŸ ื‘ืกื™ืกื™ ืœื‘ืขื™ื™ืช ื”ื‘ื™ืฆื•ืขื™ื, ืžื›ื™ื•ื•ืŸ ืฉืื ื• ื ื™ื’ืฉื™ื ืœื ืชื•ื ื™ื ืœืœื ื—ื™ืฉื•ื‘ื™ื ืžื™ื•ืชืจื™ื.

3) ื”ืชืžืžืฉื•ืช ื”ื ื•ืฃ

ืœืžืจื‘ื” ื”ืฆืขืจ, ื‘ ืฉืื™ืœืชื•ืช LINQ ืœื ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื˜ื‘ืœืื•ืช ื–ืžื ื™ื•ืช, CTEs ื•ืžืฉืชื ื™ ื˜ื‘ืœื” ื™ืฉื™ืจื•ืช.

ืขื ื–ืืช, ื™ืฉ ื“ืจืš ื ื•ืกืคืช ืœื‘ืฆืข ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืขื‘ื•ืจ ืžืงืจื” ื–ื” - ืชืฆื•ื’ื•ืช ืื™ื ื“ืงืก.

ืงื‘ื•ืฆืช ืžืฆื‘ (ืžื”ื“ื•ื’ืžื” ืœืžืขืœื”) IsClosed = 0 AND Cancelled = 0 ื•-Enabled = 0 (ืื• ืงื‘ื•ืฆื” ืฉืœ ืชื ืื™ื ื“ื•ืžื™ื ืื—ืจื™ื) ื”ื•ืคื›ืช ืœืืคืฉืจื•ืช ื˜ื•ื‘ื” ืœื”ืฉืชืžืฉ ื‘ื”ื ื‘ืชืฆื•ื’ื” ืื™ื ื“ืงืกื™ืช, ืชื•ืš ืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ ืฉืœ ืคืจื•ืกื” ืงื˜ื ื” ืฉืœ ื ืชื•ื ื™ื ืžืงื‘ื•ืฆื” ื’ื“ื•ืœื”.

ืื‘ืœ ื™ืฉื ืŸ ืžืกืคืจ ื”ื’ื‘ืœื•ืช ื‘ืขืช ืžื™ืžื•ืฉ ืชืฆื•ื’ื”:

  1. ื‘ืืžืฆืขื•ืช ืฉืื™ืœืชื•ืช ืžืฉื ื”, ืกืขื™ืคื™ื EXISTS ื™ืฉ ืœื”ื—ืœื™ืฃ ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ืœื”ืฆื˜ืจืฃ
  2. ืืชื” ืœื ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืžืฉืคื˜ื™ื ืื’ื•ื“, UNION ALL, ื™ื•ืฆื ืžืŸ ื”ื›ืœืœ, ืœึฐื”ึดืฆึฐื˜ึธืœึตื‘
  3. ืื™ื ืš ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืจืžื–ื™ื ื•ื‘ืกืขื™ืคื™ื ืœื˜ื‘ืœื” ืื•ึนืคึผึฐืฆึดื™ึธื”
  4. ืื™ืŸ ืืคืฉืจื•ืช ืœืขื‘ื•ื“ ืขื ืžื—ื–ื•ืจื™ื
  5. ืื™ ืืคืฉืจ ืœื”ืฆื™ื’ ื ืชื•ื ื™ื ื‘ืชืฆื•ื’ื” ืื—ืช ืžื˜ื‘ืœืื•ืช ืฉื•ื ื•ืช

ื—ืฉื•ื‘ ืœื–ื›ื•ืจ ืฉืืช ื”ืชื•ืขืœืช ื”ืืžื™ืชื™ืช ืฉืœ ืฉื™ืžื•ืฉ ื‘ืชืฆื•ื’ืช ืื™ื ื“ืงืก ื ื™ืชืŸ ืœื”ืฉื™ื’ ืจืง ืขืœ ื™ื“ื™ ื”ื•ืกืคืชื” ืœืื™ื ื“ืงืก ื‘ืคื•ืขืœ.

ืื‘ืœ ื‘ืขืช ืงืจื™ืื” ืœืชืฆื•ื’ื”, ืื™ืŸ ืœื”ืฉืชืžืฉ ื‘ืื™ื ื“ืงืกื™ื ื”ืืœื”, ื•ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ื”ื ื‘ืžืคื•ืจืฉ, ืขืœื™ืš ืœืฆื™ื™ืŸ WITH(NOEXPAND).

ืžืื– ื‘ ืฉืื™ืœืชื•ืช LINQ ืื™ ืืคืฉืจ ืœื”ื’ื“ื™ืจ ืจืžื–ื™ื ืœื˜ื‘ืœื”, ืื– ืืชื” ืฆืจื™ืš ืœื™ืฆื•ืจ ื™ื™ืฆื•ื’ ืื—ืจ - "ืขื˜ื™ืคื”" ืžื”ืฆื•ืจื” ื”ื‘ืื”:

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

4) ืฉื™ืžื•ืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ื˜ื‘ืœื”

ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื‘ ืฉืื™ืœืชื•ืช LINQ ื‘ืœื•ืงื™ื ื’ื“ื•ืœื™ื ืฉืœ ืฉืื™ืœืชื•ืช ืžืฉื ื” ืื• ื‘ืœื•ืงื™ื ื”ืžืฉืชืžืฉื™ื ื‘ืชืฆื•ื’ื•ืช ื‘ืขืœื•ืช ืžื‘ื ื” ืžื•ืจื›ื‘ ื™ื•ืฆืจื™ื ืฉืื™ืœืชื” ืกื•ืคื™ืช ืขื ืžื‘ื ื” ื‘ื™ืฆื•ืข ืžื•ืจื›ื‘ ืžืื•ื“ ื•ืœื ืื•ืคื˜ื™ืžืœื™.

ื”ื™ืชืจื•ื ื•ืช ื”ืขื™ืงืจื™ื™ื ืฉืœ ืฉื™ืžื•ืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ื˜ื‘ืœื” ื‘ ืฉืื™ืœืชื•ืช LINQ:

  1. ื”ื™ื›ื•ืœืช, ื›ืžื• ื‘ืžืงืจื” ืฉืœ ืชืฆื•ื’ื•ืช, ืœืฉืžืฉ ื•ืœืฆื™ื™ืŸ ื›ืื•ื‘ื™ื™ืงื˜, ืื‘ืœ ืืชื” ื™ื›ื•ืœ ืœื”ืขื‘ื™ืจ ืงื‘ื•ืฆื” ืฉืœ ืคืจืžื˜ืจื™ ืงืœื˜:
    FROM FUNCTION(@param1, @param2 ...)
    ื›ืชื•ืฆืื” ืžื›ืš, ื ื™ืชืŸ ืœื”ืฉื™ื’ ื“ื’ื™ืžืช ื ืชื•ื ื™ื ื’ืžื™ืฉื”
  2. ื‘ืžืงืจื” ืฉืœ ืฉื™ืžื•ืฉ ื‘ืคื•ื ืงืฆื™ื™ืช ื˜ื‘ืœื”, ืื™ืŸ ื”ื’ื‘ืœื•ืช ื›ื” ื—ื–ืงื•ืช ื›ืžื• ื‘ืžืงืจื” ืฉืœ ืชืฆื•ื’ื•ืช ืื™ื ื“ืงืก ื”ืžืชื•ืืจื•ืช ืœืขื™ืœ:
    1. ืจืžื–ื™ื ืœื˜ื‘ืœื”:
      ื“ืจืš LINQ ืื™ื ืš ื™ื›ื•ืœ ืœืฆื™ื™ืŸ ื‘ืื™ืœื• ืื™ื ื“ืงืกื™ื ื™ืฉ ืœื”ืฉืชืžืฉ ื•ืœืงื‘ื•ืข ืืช ืจืžืช ื‘ื™ื“ื•ื“ ื”ื ืชื•ื ื™ื ื‘ืขืช ื‘ื™ืฆื•ืข ืฉืื™ืœืชื”.
      ืื‘ืœ ืœืคื•ื ืงืฆื™ื” ื™ืฉ ืืช ื”ื™ื›ื•ืœื•ืช ื”ืืœื”.
      ืขื ื”ืคื•ื ืงืฆื™ื”, ืืชื” ื™ื›ื•ืœ ืœื”ืฉื™ื’ ืชื•ื›ื ื™ืช ืฉืื™ืœืชื•ืช ื‘ื™ืฆื•ืข ืงื‘ื•ืขื” ืœืžื“ื™, ืฉื‘ื” ืžื•ื’ื“ืจื™ื ื›ืœืœื™ื ืœืขื‘ื•ื“ื” ืขื ืื™ื ื“ืงืกื™ื ื•ืจืžื•ืช ื‘ื™ื“ื•ื“ ื ืชื•ื ื™ื
    2. ื”ืฉื™ืžื•ืฉ ื‘ืคื•ื ืงืฆื™ื” ืžืืคืฉืจ, ื‘ื”ืฉื•ื•ืื” ืœืชืฆื•ื’ื•ืช ืฉื ื•ืกืคื• ืœืื™ื ื“ืงืก, ืœื”ืฉื™ื’:
      • ืœื•ื’ื™ืงื” ืžื•ืจื›ื‘ืช ืฉืœ ื“ื’ื™ืžืช ื ืชื•ื ื™ื (ืืคื™ืœื• ื‘ืืžืฆืขื•ืช ืœื•ืœืื•ืช)
      • ืฉืœื™ืคืช ื ืชื•ื ื™ื ืžื˜ื‘ืœืื•ืช ืจื‘ื•ืช ื•ืฉื•ื ื•ืช
      • ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต ืื’ื•ื“ ะธ EXISTS

  3. ื”ืฆืขื” ืื•ึนืคึผึฐืฆึดื™ึธื” ืฉื™ืžื•ืฉื™ ืžืื•ื“ ื›ืืฉืจ ืื ื• ืฆืจื™ื›ื™ื ืœืกืคืง ื‘ืงืจืช ืžืงื‘ื™ืœื•ืช OPTION(MAXDOP N), ืกื“ืจ ืชื•ื›ื ื™ืช ื‘ื™ืฆื•ืข ื”ืฉืื™ืœืชื”. ืœื“ื•ื’ืžื”:
    • ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ ื™ืฆื™ืจื” ืžื—ื“ืฉ ื›ืคื•ื™ื” ืฉืœ ืชื•ื›ื ื™ืช ื”ืฉืื™ืœืชื•ืช ืืคืฉืจื•ืช (ื”ื™ื“ื•ืจ ืžื—ื“ืฉ)
    • ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ ืื ืœืืœืฅ ืืช ืชื•ื›ื ื™ืช ื”ืฉืื™ืœืชื” ืœื”ืฉืชืžืฉ ื‘ืกื“ืจ ื”ื”ืฆื˜ืจืคื•ืช ืฉืฆื•ื™ืŸ ื‘ืฉืื™ืœืชื” ืืคืฉืจื•ืช (ืฆื• ื‘ื›ืคื™ื™ื”)

    ืคืจื˜ื™ื ื ื•ืกืคื™ื ืขืœ ืื•ึนืคึผึฐืฆึดื™ึธื” ืžึฐืชื•ึผืึธืจ ื›ืืŸ.

  4. ืฉื™ืžื•ืฉ ื‘ืคืจื•ืกืช ื”ื ืชื•ื ื™ื ื”ืžืฆื•ืžืฆืžืช ื•ื”ื ื“ืจืฉืช ื‘ื™ื•ืชืจ:
    ืื™ืŸ ืฆื•ืจืš ืœืื—ืกืŸ ืžืขืจื›ื™ ื ืชื•ื ื™ื ื’ื“ื•ืœื™ื ื‘ืžื˜ืžื•ื ื™ื (ื›ืคื™ ืฉืงื•ืจื” ื‘ืชืฆื•ื’ื•ืช ืื™ื ื“ืงืก), ืฉืžื”ื ืขื“ื™ื™ืŸ ืฆืจื™ืš ืœืกื ืŸ ืืช ื”ื ืชื•ื ื™ื ืœืคื™ ืคืจืžื˜ืจ.
    ืœื“ื•ื’ืžื”, ื™ืฉ ื˜ื‘ืœื” ืฉื”ืžืกื ืŸ ืฉืœื” ืื™ืคื” ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืฉืœื•ืฉื” ืฉื“ื•ืช (ื ื‘ ื’).

    ื‘ืื•ืคืŸ ืงื•ื ื‘ื ืฆื™ื•ื ืœื™, ืœื›ืœ ื”ื‘ืงืฉื•ืช ื™ืฉ ืžืฆื‘ ืงื‘ื•ืข a = 0 ื•- b = 0.

    ืขื ื–ืืช, ื”ื‘ืงืฉื” ืœืชื—ื•ื c ืžืฉืชื ื” ื™ื•ืชืจ.

    ืชืŸ ืืช ื”ืชื ืื™ a = 0 ื•- b = 0 ื–ื” ื‘ืืžืช ืขื•ื–ืจ ืœื ื• ืœื”ื’ื‘ื™ืœ ืืช ืžืขืจืš ื”ืชื•ืฆืื•ืช ื”ื ื“ืจืฉ ืœืืœืคื™ ืจืฉื•ืžื•ืช, ืื‘ืœ ื”ืชื ืื™ ืขืœ ั ืžืฆืžืฆื ืืช ื”ื‘ื—ื™ืจื” ืœืžืื” ืจืฉื•ืžื•ืช.

    ื›ืืŸ ืคื•ื ืงืฆื™ื™ืช ื”ื˜ื‘ืœื” ืขืฉื•ื™ื” ืœื”ื™ื•ืช ืืคืฉืจื•ืช ื˜ื•ื‘ื” ื™ื•ืชืจ.

    ื›ืžื• ื›ืŸ, ืคื•ื ืงืฆื™ื™ืช ื˜ื‘ืœื” ืฆืคื•ื™ื” ื•ืขืงื‘ื™ืช ื™ื•ืชืจ ื‘ื–ืžืŸ ื”ื‘ื™ืฆื•ืข.

ื“ื•ื’ืžืื•ืช

ื”ื‘ื” ื ืกืชื›ืœ ืขืœ ื™ื™ืฉื•ื ืœื“ื•ื’ืžื” ื‘ืืžืฆืขื•ืช ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ ืฉืืœื•ืช ื›ื“ื•ื’ืžื”.

ื™ืฉ ื‘ืงืฉื” ืœื‘ื—ื•ืจ, ื”ืžืฉืœื‘ืช ืžืกืคืจ ื˜ื‘ืœืื•ืช ื•ืžืฉืชืžืฉืช ื‘ืชืฆื•ื’ื” ืื—ืช (OperativeQuestions), ืฉื‘ื” ื ื‘ื“ืงืช ื”ื”ืฉืชื™ื™ื›ื•ืช ื‘ื“ื•ื"ืœ (ื‘ืืžืฆืขื•ืช EXISTS) ืœ"ืฉืืœื•ืช ืื•ืคืจื˜ื™ื‘ื™ื•ืช":

ื‘ืงืฉื” ืžืก' 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])
));

ืœืชืฆื•ื’ื” ื™ืฉ ืžื‘ื ื” ืžื•ืจื›ื‘ ืœืžื“ื™: ื”ื•ื ืžื›ื™ืœ ืฆื™ืจื•ืฃ ืฉืœ ืฉืื™ืœืชื•ืช ืžืฉื ื” ื•ืžืฉืชืžืฉ ื‘ืžื™ื•ืŸ DISTINCT, ืฉื‘ืื•ืคืŸ ื›ืœืœื™ ืžื“ื•ื‘ืจ ื‘ืžื‘ืฆืข ื“ื™ ืขืชื™ืจ ืžืฉืื‘ื™ื.

ืžื“ื’ื ืž-OperativeQuestions ื”ื•ื ื›ืขืฉืจืช ืืœืคื™ื ืจืฉื•ืžื•ืช.

ื”ื‘ืขื™ื” ื”ืขื™ืงืจื™ืช ื‘ืฉืื™ืœืชื” ื–ื• ื”ื™ื ืฉืขื‘ื•ืจ ื”ืจืฉื•ืžื•ืช ืžื”ืฉืื™ืœืชื” ื”ื—ื™ืฆื•ื ื™ืช, ืชืช-ืฉืื™ืœืชื” ืคื ื™ืžื™ืช ืžื‘ื•ืฆืขืช ื‘ืชืฆื•ื’ื” [OperativeQuestions], ืฉืืžื•ืจื” ืขื‘ื•ืจ [Email] = @p__linq__0 ืœืืคืฉืจ ืœื ื• ืœื”ื’ื‘ื™ืœ ืืช ื‘ื—ื™ืจืช ื”ืคืœื˜ (ื‘ืืžืฆืขื•ืช EXISTS) ืขื“ ืžืื•ืช ืจืฉื•ืžื•ืช.

ื•ืื•ืœื™ ื ืจืื” ืฉื”ืฉืื™ืœืชื” ื”ืžืฉื ื” ืฆืจื™ื›ื” ืœื—ืฉื‘ ืืช ื”ืจืฉื•ืžื•ืช ืคืขื ืื—ืช ืœืคื™ [Email] = @p__linq__0, ื•ืื– ื›ืžื” ืžืื•ืช ื”ืจืฉื•ืžื•ืช ื”ืืœื” ืฆืจื™ื›ื•ืช ืœื”ื™ื•ืช ืžื—ื•ื‘ืจื•ืช ืขืœ ื™ื“ื™ Id ืขื ืฉืืœื•ืช, ื•ื”ืฉืื™ืœืชื” ืชื”ื™ื” ืžื”ื™ืจื”.

ืœืžืขืฉื”, ื™ืฉ ื—ื™ื‘ื•ืจ ืจืฆื™ืฃ ืฉืœ ื›ืœ ื”ื˜ื‘ืœืื•ืช: ื‘ื“ื™ืงืช ื”ืชื›ืชื‘ื•ืช ืฉืœ Id Questions ืขื Id ืž-OperativeQuestions, ื•ืกื™ื ื•ืŸ ื‘ืืžืฆืขื•ืช ืื™ืžื™ื™ืœ.

ืœืžืขืฉื”, ื”ื‘ืงืฉื” ืขื•ื‘ื“ืช ืขื ื›ืœ ืขืฉืจื•ืช ืืœืคื™ ืจืฉื•ืžื•ืช ื”-OperativeQuestions, ืืš ื ื“ืจืฉื™ื ืจืง ื”ื ืชื•ื ื™ื ื”ืžืขื ื™ื™ื ื™ื ื‘ืืžืฆืขื•ืช ื“ื•ืืจ ืืœืงื˜ืจื•ื ื™.

ื˜ืงืกื˜ ืชืฆื•ื’ืช ืฉืืœื•ืช ืื•ืคืจื˜ื™ื‘ื™ื•ืช:

ื‘ืงืฉื” ืžืก' 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();

ื‘ืžืงืจื” ื”ืกืคืฆื™ืคื™ ื”ื–ื”, ืื ื• ืฉื•ืงืœื™ื ืคืชืจื•ืŸ ืœื‘ืขื™ื” ื–ื• ืœืœื ืฉื™ื ื•ื™ื™ื ืชืฉืชื™ืชื™ื™ื, ืžื‘ืœื™ ืœื”ื›ื ื™ืก ื˜ื‘ืœื” ื ืคืจื“ืช ืขื ืชื•ืฆืื•ืช ืžื•ื›ื ื•ืช ("ืฉืื™ืœืชื•ืช ืืงื˜ื™ื‘ื™ื•ืช"), ืืฉืจ ื™ื“ืจื•ืฉ ืžื ื’ื ื•ืŸ ืœืžื™ืœื•ื™ื” ื‘ื ืชื•ื ื™ื ื•ืœืขื“ื›ื ื™ืŸ. .

ืœืžืจื•ืช ืฉื–ื”ื• ืคืชืจื•ืŸ ื˜ื•ื‘, ื™ืฉื ื” ืืคืฉืจื•ืช ื ื•ืกืคืช ืœื™ื™ืขืœ ืืช ื”ื‘ืขื™ื” ื”ื–ื•.

ื”ืžื˜ืจื” ื”ืขื™ืงืจื™ืช ื”ื™ื ืœืฉืžื•ืจ ืขืจื›ื™ื ื‘ืžื˜ืžื•ืŸ ืขืœ ื™ื“ื™ [Email] = @p__linq__0 ืžื”ืชืฆื•ื’ื” OperativeQuestions.

ื”ื›ื ืก ืืช ืคื•ื ืงืฆื™ื™ืช ื”ื˜ื‘ืœื” [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 ื™ื”ื™ื• ืื•ืคื˜ื™ืžืœื™ื•ืช ื•ื‘ืขืœื•ืช ืชื•ื›ื ื™ื•ืช ืฉืื™ืœืชื•ืช ืื•ืคื˜ื™ืžืœื™ื•ืช, ื ื“ืจืฉ ืžื‘ื ื” ืงืคื“ื ื™, ื•ืœื ื˜ื‘ืœืช ื”ื—ื–ืจื•ืช ื›ื”ื—ื–ืจื”...

ื‘ืžืงืจื” ื–ื”, ืฉืื™ืœืชื” 1 ื”ื ื“ืจืฉืช ืžื•ืžืจืช ืœืฉืื™ืœืชื” 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 ืืœืคื™ื•ืช ื”ืฉื ื™ื™ื” ืœ-2-20 ืฉื ื™ื•ืช ื•ื›ื•', ื›ืœื•ืžืจ ืžื”ืจ ื™ื•ืชืจ ืขืฉืจื•ืช ืžื•ื ื™ื.

ืื ื ื™ืงื— ืืช ื–ื” ื‘ืฆื•ืจื” ืžืžื•ืฆืขืช ื™ื•ืชืจ, ืื– ื‘ืžืงื•ื 350 ืืœืคื™ื•ืช ื”ืฉื ื™ื™ื” ืงื™ื‘ืœื ื• 8 ืืœืคื™ื•ืช ื”ืฉื ื™ื™ื”.

ืžื”ื™ืชืจื•ื ื•ืช ื”ื‘ืจื•ืจื™ื ืื ื• ืžืงื‘ืœื™ื ื’ื:

  1. ื™ืจื™ื“ื” ื›ืœืœื™ืช ื‘ืขื•ืžืก ื”ืงืจื™ืื”,
  2. ื”ืคื—ืชื” ืžืฉืžืขื•ืชื™ืช ื‘ืกื‘ื™ืจื•ืช ืœื—ืกื™ืžื”
  3. ืฆืžืฆื•ื ื–ืžืŸ ื”ื—ืกื™ืžื” ื”ืžืžื•ืฆืข ืœืขืจื›ื™ื ืžืงื•ื‘ืœื™ื

ืคืœื˜

ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื•ื›ื™ื•ื•ื ื•ืŸ ืขื“ื™ืŸ ืฉืœ ืฉื™ื—ื•ืช ืžืกื“ ื ืชื•ื ื™ื SQL MS ื“ืจืš LINQ ื”ื™ื ื‘ืขื™ื” ืฉื ื™ืชืŸ ืœืคืชื•ืจ.

ืงืฉื‘ ื•ืขืงื‘ื™ื•ืช ื—ืฉื•ื‘ื™ื ืžืื•ื“ ื‘ืขื‘ื•ื“ื” ื–ื•.

ื‘ืชื—ื™ืœืช ื”ืชื”ืœื™ืš:

  1. ื™ืฉ ืฆื•ืจืš ืœื‘ื“ื•ืง ืืช ื”ื ืชื•ื ื™ื ืฉืื™ืชื ื”ื‘ืงืฉื” ืขื•ื‘ื“ืช (ืขืจื›ื™ื, ืกื•ื’ื™ ื ืชื•ื ื™ื ื ื‘ื—ืจื™ื)
  2. ืœื‘ืฆืข ืื™ื ื“ืงืก ื ื›ื•ืŸ ืฉืœ ื ืชื•ื ื™ื ืืœื”
  3. ื‘ื“ื•ืง ืืช ื ื›ื•ื ื•ืช ืชื ืื™ ื”ื”ืฆื˜ืจืคื•ืช ื‘ื™ืŸ ื”ื˜ื‘ืœืื•ืช

ืื™ื˜ืจืฆื™ื™ืช ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื”ื‘ืื” ืžื’ืœื”:

  1. ื‘ืกื™ืก ื”ื‘ืงืฉื” ื•ืžื’ื“ื™ืจ ืืช ืžืกื ืŸ ื”ื‘ืงืฉื•ืช ื”ืจืืฉื™
  2. ื—ื–ืจื” ืขืœ ื‘ืœื•ืงื™ื ืฉืœ ืฉืื™ืœืชื•ืช ื“ื•ืžื•ืช ื•ื ื™ืชื•ื— ืฆื•ืžืช ื”ืชื ืื™ื
  3. ื‘-SSMS ืื• GUI ืื—ืจ ืขื‘ื•ืจ ืฉืจืช SQL ืžื™ื™ืขืœ ืืช ืขืฆืžื• ืฉืื™ืœืชืช SQL (ื”ืงืฆืืช ืื—ืกื•ืŸ ื ืชื•ื ื™ื ื‘ื™ื ื™ื™ื, ื‘ื ื™ื™ืช ื”ืฉืื™ืœืชื” ื”ืžืชืงื‘ืœืช ื‘ืืžืฆืขื•ืช ืื—ืกื•ืŸ ื–ื” (ื™ื™ืชื›ื ื• ื›ืžื”))
  4. ื‘ืฉืœื‘ ื”ืื—ืจื•ืŸ, ืชื•ืš ื”ืชื‘ืกืกื•ืช ืขืœ ื”ืžืชืงื‘ืœ ืฉืื™ืœืชืช SQL, ื”ืžื‘ื ื” ื ื‘ื ื” ืžื—ื“ืฉ ืฉืื™ืœืชืช LINQ

ื”ืžืชืงื‘ืœ ืฉืื™ืœืชืช LINQ ืฆืจื™ืš ืœื”ื™ื•ืช ื–ื”ื” ื‘ืžื‘ื ื” ืœืื•ืคื˜ื™ืžืœื™ ืฉื–ื•ื”ื” ืฉืื™ืœืชืช SQL ืžื ืงื•ื“ื” 3.

ืชื•ื“ื•ืช

ืชื•ื“ื” ืจื‘ื” ืœืขืžื™ืชื™ื jobgemws ะธ alex_ozr ืžื”ื—ื‘ืจื” ืคื•ืจื˜ื™ืก ืœืกื™ื•ืข ื‘ื”ื›ื ืช ื—ื•ืžืจ ื–ื”.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”