ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Π»ΠΈ ΡΠ° Π½ΡΠΊΠΎΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π°ΡΠ²ΠΊΠΈ Π½Π° 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 ΡΠ°:
- Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΊΠΎΠ΄, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΈ Π½Π΅Π½ΡΠΆΠ½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈ
- Π³ΡΡΠΏΠΈ ΠΎΡ ΡΠ»ΠΎΠΆΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ (Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ βΠΈβ ΠΈ βΠΈΠ»ΠΈβ) β
- OR Π ΠΈ , ΡΠ²ΡΡΠ·Π²Π°ΠΉΠΊΠΈ ΡΠ΅ Π² ΡΠ»ΠΎΠΆΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ, Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡΠΎΠ²Π°, ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΡΡ, ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Ρ Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈ Π½Π΅ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΏΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠΎΠ»Π΅ΡΠ°, Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Π²ΡΠ΅ ΠΏΠ°ΠΊ Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° ΠΏΡΠ°Π²ΠΈ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ ΠΏΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ (INDEX SCAN) ΠΏΠΎ Π³ΡΡΠΏΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡΠ΄ΡΠ»Π±ΠΎΠΊΠ°ΡΠ° Π²Π»ΠΎΠΆΠ΅Π½ΠΎΡΡ Π½Π° ΠΏΠΎΠ΄Π·Π°ΡΠ²ΠΊΠΈ ΠΏΡΠ°Π²ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅
- SQL-ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΠ»Π°Π½Π° Π·Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΈ DBA ΠΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ
Π‘Π΅Π³Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ.
1) ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅
1) ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅
ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ ΡΠΈΠ»ΡΡΠΈΡΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° Π·Π°ΡΠ²ΠΊΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΎ ΡΡΠ»ΠΎΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° ΠΎΠΊΠΎΠ»ΠΎ Π΅Π΄Π½Π°-Π΄Π²Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ (Π·Π°ΡΠ²ΠΊΠΈ-Π»ΠΈΡΠ½ΠΎΡΡΠΈ-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ) ΠΈ Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΡΠ»ΠΎΠ²ΠΈΡ (IsClosed, Canceled, Enabled, Status). ΠΠ°ΠΆΠ½ΠΎ Π΅ Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΠ΅Π»Π΅ΠΊΡΠΈΠΈ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π°Ρ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ.
Π’ΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅ ΡΠ°Π·ΡΠΌΠ½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅Π»Π΅ΠΊΡΠΈΡΡΠ° ΠΏΠΎ ΡΠ΅Π·ΠΈ ΠΏΠΎΠ»Π΅ΡΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π° Π²ΡΡΡΠ°Π½ΠΎΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌΠ°ΠΌΠ΅ 500000 Π·Π°ΡΠ²ΠΊΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π°ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ° ΡΠ°ΠΌΠΎ 2000 Π·Π°ΠΏΠΈΡΠ°. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΏΠΎΠ΄Π±ΡΠ°Π½ΠΈΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ΅ Π½ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈ ΠΎΡ ) ΠΏΠΎ Π³ΡΡΠΏΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΠΈ ΡΠ΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π±ΡΡΠ·ΠΎ Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ Π΄Π°Π½Π½ΠΈ ΡΡΠ΅Π· Π½Π΅ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·ΠΈΡΠ°Π½ ΠΈΠ½Π΄Π΅ΠΊΡ.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π»ΠΈΠΏΡΠ°ΡΠ° Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π° ΡΡΠ΅Π· ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΠ»Π°Π½Π° Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° ΠΈΠ»ΠΈ ΡΡΠ΅Π· ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ MS SQL Server:
ΠΡΠΈΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΡΠ° ΡΡΠ΄ΡΡΠΆΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π»ΠΈΠΏΡΠ²Π°ΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½ΠΈΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΠΈ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΡΠ΅ΡΡΠΎ ΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΠΏΡΠ°Π²ΡΠ½Π΅ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΈΡΠΈΡΠ΅ ΠΎΡ Π»ΠΎΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π½Π° LINQ ΠΈ SQL-Π·Π°ΡΠ²ΠΊΠΈ.
ΠΠ°ΠΊΡΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° ΡΡΡΠΎΠ²Π°ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π² Π±ΠΈΠ·Π½Π΅ΡΠ°, ΡΠ΅ΡΡΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π±ΠΈΠ·Π½Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΠΎΠΊΠΎΠ²Π΅. Π Π·Π°ΡΠΎΠ²Π° ΡΠ΅ΡΡΠΎ ΡΠ΅ΠΆΠΊΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠΎΠ½ΠΎΠ²ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Ρ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅.
ΠΡΡΠ°ΡΡΠΈ ΡΠΎΠ²Π° Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ° ΠΌΡ Π½ΡΠΆΠ½ΠΈ Π½Π°ΠΉ-Π°ΠΊΡΡΠ°Π»Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΈ ΡΠ΅ Π΄ΠΎΡΡΠΈΠ³Π° ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ°Π²Π°Ρ Π±ΠΈΠ·Π½Π΅Ρ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ, Π½ΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΠΏΠΎΠ½ΠΈΠΆΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΏΡΠΎΡΡΠΎ ΠΎΡΠ»Π°Π³Π°ΠΉΠΊΠΈ ΡΠ΅ΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠΌΠ½ΠΈ, ΡΠ΅ ΠΏΡΠΈ ΡΡΡΡΠ΅Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° MS SQL Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π΅ΡΠΎΡΠ½ΠΈ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΏΡΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ:
- Π°ΠΊΠΎ Π²Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Ρ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΠΎΠ»Π΅ΡΠ°
- Π°ΠΊΠΎ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ (ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ).
2) ΠΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π½Π° Π°ΡΡΠΈΠ±ΡΡΠΈ Π² Π΅Π΄ΠΈΠ½ Π½ΠΎΠ² Π°ΡΡΠΈΠ±ΡΡ
ΠΠΎΠ½ΡΠΊΠΎΠ³Π° Π½ΡΠΊΠΎΠΈ ΠΏΠΎΠ»Π΅ΡΠ° ΠΎΡ Π΅Π΄Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΏΠΎ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±Π°Π·ΠΈΡΠ°Ρ Π³ΡΡΠΏΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΈ Ρ Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄Π½ΠΎ Π½ΠΎΠ²ΠΎ ΠΏΠΎΠ»Π΅.
ΠΡΠΎΠ±Π΅Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ Π΅ Π·Π° ΠΏΠΎΠ»Π΅ΡΠ°-ΡΡΡΡΠΎΡΠ½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ° ΠΈΠ»ΠΈ Π±ΠΈΡΠΎΠ²ΠΈ, ΠΈΠ»ΠΈ ΡΠ΅Π»ΠΈ ΡΠΈΡΠ»Π°.
ΠΡΠΈΠΌΠ΅Ρ:
IsClosed = 0 Π Canceled = 0 Π Enabled = 0 ΡΠ΅ Π·Π°ΠΌΠ΅Π½Ρ Ρ Status = 1.
Π’ΡΠΊ ΡΠ΅ Π²ΡΠ²Π΅ΠΆΠ΄Π° ΡΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ Π°ΡΡΠΈΠ±ΡΡ Status, ΠΎΡΠΈΠ³ΡΡΠ΅Π½ΠΎ ΡΡΠ΅Π· ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΠΈ ΡΡΠ°ΡΡΡΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ Π½ΠΎΠ² Π°ΡΡΠΈΠ±ΡΡ.
Π’ΠΎΠ²Π° Π΅ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½ΠΈΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ Π±Π΅Π· ΠΈΠ·Π»ΠΈΡΠ½ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ.
3) ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π² 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 ΠΈ b = 0.
ΠΠ±Π°ΡΠ΅, Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ ΠΏΠΎΠ»Π΅ΡΠΎ Ρ Π΅ ΠΏΠΎ-Π²Π°ΡΠΈΠ°ΡΠΈΠ²Π½Π°.
ΠΠ΅ΠΊΠ° ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ a = 0 ΠΈ 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)
public class QuestionsDbContext : DbContext
{
//...
public DbQuery OperativeQuestions { get; set; }
//...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query().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] Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΠ·ΠΏΡΠ°ΡΠ°ΠΉΠΊΠΈ 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 [OperativeQuestions] 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<OperativeQuestion> ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ { get; set; }
//...
Π·Π°ΡΠΈΡΠ΅Π½override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query<OperativeQuestion>().ToView("OperativeQuestions");
}
}
ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ ΡΡΠ°ΡΠΈΡΠ΅Π½ ΠΊΠ»Π°Ρ FromSqlQueries
{
ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎ ΡΡΠ°ΡΠΈΡΠ½ΠΎ IQueryable<OperativeQuestion> GetByUserEmail(this DbQuery<OperativeQuestion> source, string Email)
=> source.FromSql($"SELECT Id, Email FROM [dbo].[OperativeQuestionsUserMail] ({Email})");
}
ΠΡΠΎΠ³ΠΎΠ²ΠΈΡΡ LINQ-Π·Π°ΠΏΡΠΎΡ
var businessObjectsData = await context
.ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΡΠΏΡΠΎΡΠΈ
.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 ΠΌΡ.
ΠΡ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΈΡΠ΅ ΠΏΠ»ΡΡΠΎΠ²Π΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅:
- ΠΎΠ±ΡΠΎ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½Π΅,
- Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΠ° ΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠ°Π½ΠΈΡ
- Π½Π°ΠΌΠ°Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ΅Π΄Π½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π΅ Π΄ΠΎ ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ
ΠΠ·Π²ΠΎΠ΄
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΈ ΠΏΡΠ΅ΡΠΈΠ·Π½ΠΎΡΠΎ Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡΡΠΏΠΈΡΠ΅ Π΄ΠΎ ΠΠ MS SQL ΡΡΠ΅Π· LINQ Π΅ Π·Π°Π΄Π°ΡΠ°, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ.
Π ΡΠ°Π·ΠΈ ΡΠ°Π±ΠΎΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΈ ΡΠ° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
Π Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°:
- Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΡ Π΄Π°Π½Π½ΠΈΡΠ΅, Ρ ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ (ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΠΈΠ·Π±ΡΠ°Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ)
- Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ Π½Π° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ
- Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅
ΠΠ° ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΠΈΡΠ΅ΡΠ°ΡΠΈΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Ρ:
- ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΡΠΈΠ»ΡΡΡ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ
- ΠΏΠΎΠ²ΡΠ°ΡΡΡΠΈ ΡΠ΅ ΡΡ ΠΎΠ΄Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΏΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ
- Π² SSMS ΠΈΠ»ΠΈ Π΄ΡΡΠ³ GUI Π·Π° SQL Server ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠ΅ ΡΠ°ΠΌΠΈΡΡ SQL-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ (ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΡΡΡΠΎΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ (ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ))
- Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π΅ΡΠ°ΠΏ, Π²Π·Π΅ΠΌΠ°ΠΉΠΊΠΈ Π·Π° ΠΎΡΠ½ΠΎΠ²Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ½ΠΈΡ SQL-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅, ΡΠ΅ ΠΏΡΠ΅ΡΡΡΡΠΎΡΠ²Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° LINQ-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ
Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎΡΠΎ LINQ-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ°Π½Π΅ ΠΏΠΎ ΡΡΡΡΠΊΡΡΡΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎ Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½ΠΎΡΠΎ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎ SQL-Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΎΡ ΡΠΎΡΠΊΠ° 3.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ
ΠΠ³ΡΠΎΠΌΠ½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΠΊΠΎΠ»Π΅Π³ΠΈΡΠ΅ ΠΈ ΠΎΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Fortis Π·Π° ΠΏΠΎΠΌΠΎΡΡΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°ΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π».
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
