ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π Π±ΡΡ
Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ Π½ΡΠΊΠΎΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ LINQ Π·Π°ΡΠ²ΠΊΠΈ.
Π’ΡΠΊ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΠΎΡΠ΅ Π½ΡΠΊΠΎΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ΄Π°, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ LINQ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅.
ΠΠ·Π²Π΅ΡΡΠ½ΠΎ Π΅, ΡΠ΅ LINQ(Language-Integrated Query) β ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡ ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½ Π΅Π·ΠΈΠΊ Π·Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ.
Π LINQ to SQL Π΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π΄Π°Π½Π½ΠΈ Π² Π‘Π£ΠΠ. Π’ΠΎΠ²Π° Π΅ ΠΌΠΎΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π΄Π°Π½Π½ΠΈ, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ ΡΡΠ΅Π· Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π΅Π½ Π΅Π·ΠΈΠΊ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Ρ Π·Π°ΡΠ²ΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Ρ Π² SQL Π·Π°ΡΠ²ΠΊΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° ΠΈ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ Π½Π° ΡΡΡΠ²ΡΡ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΏΠΎΠ΄ Π‘Π£ΠΠ ΡΠ°Π·Π±ΠΈΡΠ°ΠΌΠ΅ MS SQL Server.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, LINQ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Ρ Π² ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ SQL Π·Π°ΡΠ²ΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π±ΠΈ ΠΌΠΎΠ³ΡΠ» Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ ΠΎΠΏΠΈΡΠ΅Π½ DBA Ρ Π²ΡΠΈΡΠΊΠΈ Π½ΡΠ°Π½ΡΠΈ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° SQL Π·Π°ΡΠ²ΠΊΠΈ:
- ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΈ ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (JOIN) ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ (WHERE)
- ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½ΡΠ°Π½ΡΠΈ Π² ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ Π³ΡΡΠΏΠΎΠ²ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ
- ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ Π² Π·Π°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΡ IN Π½Π° EXISTSΠΈ NOT IN, Π½Π° EXISTS
- ΠΏΡΠΎΠΌΠ΅ΠΆΠ΄ΡΡΡΡΠ½ΠΎ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΡΡΠ΅Π· Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ, CTE, ΡΠ°Π±Π»ΠΈΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
- ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (OPTION) Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΈ ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ Ρ ΠΈΠ½ΡΠΎΠ²Π΅ WITH (β¦)
- ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΊΠ°ΡΠΎ Π΅Π΄Π½ΠΎ ΠΎΡ ΡΡΠ΅Π΄ΡΡΠ²Π°ΡΠ° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π°Π²ΠΈΠΌ ΠΎΡ ΠΈΠ·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΏΡΠΈ ΠΈΠ·Π²Π»ΠΈΡΠ°Π½ΠΈΡ
ΠΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΠΈ ΠΌΠ΅ΡΡΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ SQL Π·Π°ΡΠ²ΠΊΠΈ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ LINQ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ°:
- ΠΊΠΎΠ½ΡΠΎΠ»ΠΈΠ΄Π°ΡΠΈΡΡΠ° Π½Π° ΡΠ΅Π»ΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² Π΅Π΄Π½Π° Π·Π°ΡΠ²ΠΊΠ°
- Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΊΠΎΠ΄, ΠΊΠΎΠ΅ΡΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΈ ΠΈΠ·Π»ΠΈΡΠ½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈ
- Π³ΡΡΠΏΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΡΡΡΠ°Π²Π½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ (Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ Β«ΠΈΒ» ΠΈ Β«ΠΈΠ»ΠΈΒ») β AND ΠΈ OR, ΡΡΠ΅Π΄ΠΈΠ½ΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅ Π² ΡΠ»ΠΎΠΆΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ, Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡΠΎΠ²Π°, ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΡΡ, ΠΈΠΌΠ°ΠΉΠΊΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈ Π½Π΅ΠΊΠ»ΡΡΡΠ΅ΡΠΈΠ·ΠΎΠ²Π°Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, ΠΏΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠΎΠ»Π΅ΡΠ°, Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Π²ΡΠ΅ ΠΏΠ°ΠΊ Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° ΠΏΡΠ°Π²ΠΈ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ ΠΏΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ (INDEX SCAN) ΠΏΠΎ Π³ΡΡΠΏΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ
- Π΄ΡΠ»Π±ΠΎΠΊΠ°ΡΠ° Π²Π»ΠΎΠΆΠ΅Π½ΠΎΡΡ Π½Π° ΠΏΠΎΠ΄Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ°Π·ΡΠΈΡΡΠΎΠ²Π°Π½Π΅ΡΠΎ SQL ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈ ΡΠ°Π·Π±ΠΎΡΡΡ Π½Π° ΠΏΠ»Π°Π½Π° Π·Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΈ DBA
ΠΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ
Π‘Π΅Π³Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ.
1) ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅
ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠΈ Π½Π° ΠΈΠ·Π²Π°Π΄ΠΊΠ°ΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΎ ΡΠ΅Π»ΠΈΡΡ Π·Π°ΠΏΠΈΡ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° ΠΎΠΊΠΎΠ»ΠΎ Π΅Π΄Π½Π°-Π΄Π²Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ (Π·Π°ΡΠ²ΠΊΠΈ-Π»ΡΠ΄ΠΈ-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ) ΠΈ Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΡΠ»ΠΎΠ²ΠΈΡ (IsClosed, Canceled, Enabled, Status). ΠΠ°ΠΆΠ½ΠΎ Π΅ Π·Π° ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ ΠΈΠ·Π²Π°Π΄ΠΊΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ.
Π’ΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ», ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ·Π±ΠΎΡΡΡ ΠΏΠΎ ΡΠ΅Π·ΠΈ ΠΏΠΎΠ»Π΅ΡΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π° Π²ΡΡΠ½Π°ΡΠΎΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌΠ°ΠΌΠ΅ 500000 Π·Π°ΡΠ²ΠΊΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π°ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ° ΡΠ°ΠΌΠΎ 2000 Π·Π°ΠΏΠΈΡΠ°. Π’ΠΎΠ³Π°Π²Π° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΏΠΎΠ΄Π±ΡΠ°Π½ΠΈΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ΅ Π½ΠΈ ΠΈΠ·Π±Π°Π²ΠΈ ΠΎΡ INDEX SCAN ΠΏΠΎ Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΠΈ ΡΠ΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π±ΡΡΠ·ΠΎ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ Π΄Π°Π½Π½ΠΈ ΡΡΠ΅Π· Π½Π΅ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·ΠΈΡΠ°Π½ ΠΈΠ½Π΄Π΅ΠΊΡ.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π½Π΅Π΄ΠΎΡΡΠΈΠ³ΡΡ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½ ΡΡΠ΅Π· ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ ΠΏΡΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΠ»Π°Π½ΠΎΠ²Π΅ΡΠ΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ. MS SQL Server:
ΠΡΠΈΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΡΠ° ΡΡΠ΄ΡΡΠΆΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π»ΠΈΠΏΡΠ²Π°ΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΠΈ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΡΠ΅ΡΡΠΎ ΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΠΏΡΠ°Π²ΡΠ½Π΅ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡΡΠ° ΠΎΡ ΡΠ»Π°Π±ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ LINQ Π·Π°ΡΠ²ΠΊΠΈ ΠΈ SQL Π·Π°ΡΠ²ΠΊΠΈ.
ΠΠ°ΠΊΡΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° ΡΡΡΠΎΠ²Π°ΡΠ° Π±ΠΈΠ·Π½Π΅Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°, ΡΠ΅ΡΡΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π±ΠΈΠ·Π½Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΠΎΠΊΠΎΠ²Π΅. Π Π·Π°ΡΠΎΠ²Π° ΡΠ΅ΡΡΠΎ ΡΠ΅ΠΆΠΊΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ Π²ΡΠ² ΡΠΎΠ½ΠΎΠ² ΡΠ΅ΠΆΠΈΠΌ Ρ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅.
ΠΡΡΠ°ΡΡΠΈ ΡΠΎΠ²Π° Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΡ ΡΡΡΠ±Π²Π°Ρ Π½Π°ΠΉ-Π½ΠΎΠ²ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π° ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ² Π½ΠΈΠ²ΠΎ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ°Ρ Π±ΠΈΠ·Π½Π΅Ρ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ, Π½ΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Π½Π°ΠΌΠ°Π»ΡΠ²Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΏΡΠΎΡΡΠΎ ΠΎΡΠ»Π°Π³Π°ΠΉΠΊΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠΌΠ½ΠΈ, ΡΠ΅ ΠΏΡΠΈ ΡΡΡΡΠ΅Π½Π΅ΡΠΎ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π½ΠΎΠ²ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° MS SQL Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π΅ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ:
- Π°ΠΊΠΎ Π²Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Ρ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΠΎΠ»Π΅ΡΠ°
- Π°ΠΊΠΎ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ΡΠΎ (ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π·Π° ΡΠΎΠ²Π° Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ).
2) ΠΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π½Π° Π°ΡΡΠΈΠ±ΡΡΠΈΡΠ΅ Π² Π΅Π΄ΠΈΠ½ Π½ΠΎΠ² Π°ΡΡΠΈΠ±ΡΡ
ΠΠΎΠ½ΡΠΊΠΎΠ³Π° Π½ΡΠΊΠΎΠΈ ΠΏΠΎΠ»Π΅ΡΠ° ΠΎΡ Π΅Π΄Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΏΠΎ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π³ΡΡΠΏΠ° ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΈ Ρ Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄Π½ΠΎ Π½ΠΎΠ²ΠΎ ΠΏΠΎΠ»Π΅.
ΠΡΠΎΠ±Π΅Π½ΠΎ Π°ΠΊΡΡΠ°Π»Π½ΠΎ Π΅ Π·Π° ΡΡΡΡΠΎΡΠ½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎ ΡΠΈΠΏ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ° ΠΈΠ»ΠΈ Π±ΠΈΡΠΎΠ²ΠΈ, ΠΈΠ»ΠΈ ΡΠ΅Π»ΠΈ ΡΠΈΡΠ»Π°.
ΠΡΠΈΠΌΠ΅Ρ:
IsClosed = 0 Π Canceled = 0 Π Enabled = 0 ΡΠ΅ Π·Π°ΠΌΠ΅Π½Ρ Ρ Status = 1.
Π’ΡΠΊ ΡΠ΅ Π²ΡΠ²Π΅ΠΆΠ΄Π° ΡΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ Π°ΡΡΠΈΠ±ΡΡ Status, ΠΎΡΠΈΠ³ΡΡΠ΅Π½ΠΎ ΠΎΡ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ ΡΡΠ°ΡΡΡΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ Π½ΠΎΠ² Π°ΡΡΠΈΠ±ΡΡ.
Π’ΠΎΠ²Π° Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½ΠΈΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ Π±Π΅Π· ΠΈΠ·Π»ΠΈΡΠ½ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ.
3) ΠateralΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π² LINQ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅Π²ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ, CTE ΠΈ ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ Π½Π°ΡΠΈΠ½ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ β ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ.
ΠΡΡΠΏΠ°ΡΠ° ΡΡΠ»ΠΎΠ²ΠΈΡ (ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅) IsClosed = 0 Π Canceled = 0 Π Enabled = 0 (ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ) ΡΡΠ°Π²Π° Π΄ΠΎΠ±ΡΡ Π²Π°ΡΠΈΠ°Π½Ρ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΈΠΌ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΊΠ΅ΡΠΈΡΠ°ΠΉΠΊΠΈ ΠΌΠ°Π»ΡΠΊ ΡΡΠ΅Π· Π΄Π°Π½Π½ΠΈ ΠΎΡ Π³ΠΎΠ»ΡΠΌΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ.
ΠΠΎ ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΡΠ°:
- ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ΄Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ EXISTS ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π·Π°ΠΌΠ΅Π½ΡΡ Ρ JOIN
- Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ UNION, UNION ALL, EXCEPTION, INTERSECT
- Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ OPTION
- Π½ΡΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΈΠΊΠ»ΠΈ
- Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ Π΄Π°Π½Π½ΠΈ Π² Π΅Π΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ
ΠΠ°ΠΆΠ½ΠΎ Π΅ Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΠ΅ ΡΠ΅Π°Π»Π½Π°ΡΠ° ΠΏΠΎΠ»Π·Π° ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°ΡΠ° Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ°ΠΌΠΎ ΠΏΡΠΈ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅.
ΠΠΎ ΠΏΡΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ, ΡΠ΅Π·ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ, Π° Π·Π° ΡΠ²Π½ΠΎΡΠΎ ΠΈΠΌ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΡΠΊΠ°Π·Π²Π° WITH (NOEXPAND).
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π² LINQ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ, Π·Π°ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΎΡΠ΅ Π΅Π΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ β 'ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°' ΠΎΡ ΡΠ»Π΅Π΄Π½ΠΈΡ Π²ΠΈΠ΄:
CREATE VIEW ΠΠΠ_ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);
4) ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ
Π§Π΅ΡΡΠΎ Π² LINQ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° Π³ΠΎΠ»Π΅ΠΌΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΏΠΎΠ΄Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡ ΡΠ»ΠΎΠΆΠ½Π° ΡΡΡΡΠΊΡΡΡΠ°, ΠΎΡΠΎΡΠΌΡΡ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π° ΠΈ Π½Π΅ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½Π° ΡΡΡΡΠΊΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅.
ΠΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π² LINQ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ°:
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π² ΡΠ»ΡΡΠ°Ρ Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΡΠ°, Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ ΡΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΡΠΎ ΠΎΠ±Π΅ΠΊΡ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π½Π°Π±ΠΎΡ ΠΎΡ Π²Ρ
ΠΎΠ΄Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ:
FROM FUNCTION(@param1, @param2 β¦)
Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ Π³ΡΠ²ΠΊΠ°Π²ΠΎ ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ - Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Π½ΡΠΌΠ° ΡΠ°ΠΊΠΈΠ²Π° ΡΡΡΠΎΠ³ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΠΈΠΌΠ°ΡΠ΅ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΠΏΠΎ-Π³ΠΎΡΠ΅:
- Π’Π°Π±Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ:
ΡΡΠ΅Π· LINQ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΡΠ°Ρ ΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ»Π°ΡΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΡΠΈ Π·Π°ΡΠ²ΠΊΠ°.
ΠΠΎ Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΡΠ΅Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ.
Π‘ ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π΅Π½ ΠΏΠ»Π°Π½ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΠΈ Π½ΠΈΠ²Π°ΡΠ° Π½Π° ΠΈΠ·ΠΎΠ»Π°ΡΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅. - ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ, Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ:
- ΡΠ»ΠΎΠΆΠ½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΠΊΠ»ΠΈ)
- ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ.
- Π½Π°ΡΠΈΠ½ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ UNION ΠΈ EXISTS
- Π’Π°Π±Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ:
- ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ OPTION Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ°Π»Π΅Π»ΠΈΠ·ΠΌΠ°. OPTION(MAXDOP N), ΡΠ΅Π΄Π° Π½Π° ΠΏΠ»Π°Π½Π° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
- ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΊΠ°ΠΆΠ΅ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠ΅ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ»Π°Π½Π° Π·Π° Π·Π°ΡΠ²ΠΊΠ°. OPTION (RECOMPILE)
- ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΊΠ°ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠ»Π°Π½Π° Π·Π° Π·Π°ΡΠ²ΠΊΠ° ΡΠ΅Π΄Π° Π½Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅, ΠΏΠΎΡΠΎΡΠ΅Π½ Π² Π·Π°ΡΠ²ΠΊΠ°ΡΠ°. OPTION (FORCE ORDER)
ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π·Π° OPTION Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ. .
- ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½Π°ΠΉ-ΡΠ΅ΡΠ½ΠΈΡ ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ ΡΡΠ΅Π· Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅:
ΠΡΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° ΡΠ΅ Π΄ΡΡΠΆΠ°Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π² ΠΊΠ΅ΡΠΎΠ²Π΅ (ΠΊΠ°ΠΊΡΠΎ Π² ΡΠ»ΡΡΠ°Ρ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ), ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ°Ρ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌΠ° ΡΠ°Π±Π»ΠΈΡΠ°, Π·Π° ΠΊΠΎΡΡΠΎ Π·Π° ΡΠΈΠ»ΡΡΡ WHERE ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠΈ ΠΏΠΎΠ»Π΅ΡΠ° (a, b, c).Π£ΡΠ»ΠΎΠ²Π½ΠΎ Π·Π° Π²ΡΠΈΡΠΊΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΈΠΌΠ° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ a = 0 and b = 0..
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π° ΠΏΠΎΠ»Π΅ΡΠΎ c Π΅ ΠΏΠΎ-Π²Π°ΡΠΈΠ°ΡΠΈΠ²Π½Π°.
ΠΠ΅ΠΊΠ° ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ a = 0 and b = 0. Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎ Π½ΠΈ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½ Π½Π°Π±ΠΎΡ Π΄ΠΎ Ρ ΠΈΠ»ΡΠ΄ΠΈ Π·Π°ΠΏΠΈΡΠΈ, Π½ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ ΠΏΠΎ Ρ ΡΠΆ ΡΡΠΆΠ°Π²Π° ΠΈΠ·Π±ΠΎΡΠ° Π΄ΠΎ ΡΡΠΎΡΠΈΠ½Π° Π·Π°ΠΏΠΈΡΠ°.
Π’ΡΠΊ ΡΠ°Π±Π»ΠΈΡΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ ΠΏΠΎ-ΠΈΠ·Π³ΠΎΠ΄Π΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ°Π±Π»ΠΈΡΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΅ ΠΏΠΎ-ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠ° ΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½Π° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅.
ΠΡΠΈΠΌΠ΅ΡΠΈ
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Questions.
ΠΠΌΠ° Π·Π°ΡΠ²ΠΊΠ° SELECT, ΠΊΠΎΡΡΠΎ ΡΠ²ΡΡΠ·Π²Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π±Π»ΠΈΡΠΈ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΅Π΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ (OperativeQuestions), Π² ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΏΠΎ email ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΡΠ° (ΡΡΠ΅Π· EXISTS) ΠΊΡΠΌ "ΠΠΊΡΠΈΠ²Π½ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ"([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])
));
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠΌΠ° Π΄ΠΎΡΡΠ° ΡΠ»ΠΎΠΆΠ½Π° ΡΡΡΡΠΊΡΡΡΠ°: Π² Π½Π΅Π³ΠΎ ΠΈΠΌΠ° ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π° ΠΏΠΎΠ΄Π·Π°ΠΏΠΈΡΠΈ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° DISTINCT, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ.
ΠΠ·Π²Π»ΠΈΡΠ°Π½Π΅ ΠΎΡ OperativeQuestions Π½Π° ΠΎΠΊΠΎΠ»ΠΎ Π΄Π΅ΡΠ΅Ρ Ρ ΠΈΠ»ΡΠ΄ΠΈ Π·Π°ΠΏΠΈΡΠ°.
ΠΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π° ΡΠΎΠ·ΠΈ Π·Π°ΠΏΡΠΎΡ Π΅, ΡΠ΅ Π·Π° Π·Π°ΠΏΠΈΡΠΈΡΠ΅ ΠΎΡ Π²ΡΠ½ΡΠ½ΠΈΡ Π·Π°ΠΏΡΠΎΡ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π²ΡΡΡΠ΅ΡΠ½ΠΎ ΠΏΠΎΠ΄Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π²ΡΡΡ Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ΡΠΎ [OperativeQuestions], ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ Π·Π° [Email] = @p__linq__0 (ΡΡΠ΅Π· EXISTS) Π΄ΠΎ ΡΡΠΎΡΠΈΡΠΈ Π·Π°ΠΏΠΈΡΠ°.
Π ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΠ΅ ΠΏΠΎΠ΄Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈ Π²Π΅Π΄Π½ΡΠΆ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π·Π° [Email] = @p__linq__0, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅Π·ΠΈ ΡΡΠΎΡΠΈΠ½Π° Π·Π°ΠΏΠΈΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ°Ρ ΠΏΠΎ Id Ρ Questions, ΠΈ Π·Π°ΠΏΡΠΎΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π±ΡΡΠ·.
ΠΡΡΡΠ½ΠΎΡΡ ΠΎΠ±Π°ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ: ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π° Id Π½Π° Questions Ρ Id ΠΎΡ OperativeQuestions, ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΠΏΠΎ Email.
Π‘ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ° ΡΠ°Π±ΠΎΡΠΈ Ρ Π²ΡΠΈΡΠΊΠΈ Π΄Π΅ΡΠ΅ΡΠΊΠΈ Ρ ΠΈΠ»ΡΠ΄ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π½Π° OperativeQuestions, Π° Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ° Π½ΡΠΆΠ½ΠΈ ΡΠ°ΠΌΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΏΠΎ Email.
Π’Π΅ΠΊΡΡ Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ΡΠΎ 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)
ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ ΠΊΠ»Π°Ρ QuestionsDbContext : DbContext
{
\/\/...
ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎ DbQuery<OperativeQuestion> ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ { ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅; Π·Π°Π΄Π°Π²Π°Π½Π΅; }
\/\/...
Π·Π°ΡΠΈΡΠ΅Π½ override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query<OperativeQuestion>().ToView("ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ");
}
}
ΠΠ·Ρ ΠΎΠ΄Π΅Π½ LINQ Π·Π°ΠΏΠΈΡ
var businessObjectsData = await context
.ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ
.Where(x => x.Email == Email)
.Include(x => x.Question)
.Select(x => x.Question)
.SelectMany(x => x.ObjectQuestions,
(x, bo) => Π½ΠΎΠ²
{
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 ΠΎΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ΡΠΎ ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ.
ΠΡΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠ°Π±Π»ΠΈΡΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ [dbo].[OperativeQuestionsUserMail] Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΠ·ΠΏΡΠ°ΡΠ°ΠΉΠΊΠΈ Email ΠΊΠ°ΡΠΎ Π²Ρ ΠΎΠ΄Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π΄Π°Π½Π½ΠΈ:
ΠΠ°ΠΏΠΈΡΠ²Π°Π½Π΅ β 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 [ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ] AS [x] WHERE [x].[Email] = @Email;
RETURN;
END
Π’ΡΠΊ ΡΠ΅ Π²ΡΡΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π΄Π°Π½Π½ΠΈ Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡΡΡΠΊΡΡΡΠ°.
ΠΠ° Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° ΠΊΡΠΌ OperativeQuestionsUserMail ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΈ, Ρ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΈ ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ°, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΡΡΡΠΎΠ³Π° ΡΡΡΡΠΊΡΡΡΠ°, Π° Π½Π΅ RETURNS TABLE AS RETURNβ¦
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΡΡΡΠ΅Π½ΠΎΡΠΎ ΠΠ°ΠΏΠΈΡΠ²Π°Π½Π΅ 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)
ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ ΠΊΠ»Π°Ρ QuestionsDbContext : DbContext
{
//...
ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ DbQuery ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ { get; set; }
//...
Π·Π°ΡΠΈΡΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π° void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query().ToView("ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ");
}
}
ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ ΡΡΠ°ΡΠΈΡΠ΅Π½ ΠΊΠ»Π°Ρ FromSqlQueries
{
ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ ΡΡΠ°ΡΠΈΡΠ΅Π½ IQueryable GetByUserEmail(ΡΠ°Π·ΠΈ DbQuery ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ, Π½ΠΈΠ· Email)
=> ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ.FromSql($"SELECT Id, Email FROM [dbo].[ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΠΎΡΠ°] ({Email})");
}
ΠΡΠ°Π΅Π½ LINQ-Π·Π°ΠΏΡΠΎΡ
var businessObjectsData = await context
.ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ
.GetByUserEmail(Email)
.Include(x => x.ΠΡΠΏΡΠΎΡ)
.Select(x => x.ΠΡΠΏΡΠΎΡ)
.SelectMany(x => x.ΠΠ±Π΅ΠΊΡΠΡΠΏΡΠΎΡΠΈ,
(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 ΠΌΡ.
ΠΡ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅:
- ΠΎΠ±ΡΠΎ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½Π΅,
- Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΠ° ΠΎΡ Π±Π»ΠΎΠΊΠ°ΠΆΠΈ,
- Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ΅Π΄Π½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° Π±Π»ΠΎΠΊΠ°ΠΆ Π΄ΠΎ ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ.
ΠΠ·Π²ΠΎΠ΄
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΈ ΡΠΈΠ½ΠΎΡΠΎ Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ ΠΠ MS SQL ΡΡΠ΅Π· LINQ Π΅ Π·Π°Π΄Π°ΡΠ°, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½Π°.
Π ΡΠ°Π·ΠΈ ΡΠ°Π±ΠΎΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΎ Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
Π Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°:
- Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ°, Ρ ΠΊΠΎΡΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ (ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΠΈΠ·Π±ΡΠ°Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ),
- Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ,
- Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ²ΡΡΠ·Π²Π°ΡΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅.
ΠΠ° ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΠΈΡΠ΅ΡΠ°ΡΠΈΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Ρ:
- ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΡΠΈΠ»ΡΡΡ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ,
- ΠΏΠΎΠ²ΡΠ°ΡΡΡΠΈ ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΡΠΈΠΏΠΎΠΊΡΠΈΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ°.
- Π² SSMS ΠΈΠ»ΠΈ Π΄ΡΡΠ³ GUI Π·Π° SQL Server ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠ΅ ΡΠ°ΠΌΠΈΡΡ SQL-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅, (ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΡΠ°ΠΉΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ (ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ))
- Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π΅ΡΠ°ΠΏ, Π²Π·ΠΈΠΌΠ°ΠΉΠΊΠΈ Π·Π° ΠΎΡΠ½ΠΎΠ²Π° ΠΊΡΠ°ΠΉΠ½ΠΎΡΠΎ SQL-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅,, ΡΠ΅ ΠΏΡΠ΅ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° LINQ-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ.
Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎΡΠΎ LINQ-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ°Π½Π΅ ΠΏΠΎ ΡΡΡΡΠΊΡΡΡΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎ Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½ΠΎΡΠΎ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎ SQL-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΎΡ ΡΠΎΡΠΊΠ° 3.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ
ΠΠ³ΡΠΎΠΌΠ½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΠΊΠΎΠ»Π΅Π³ΠΈΡΠ΅ ΠΈ ΠΎΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Fortis Π·Π° ΠΏΠΎΠΌΠΎΡΡΠ° Π² ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°ΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π».
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
