ืืืื
ะ
ืืื ืื ื ืืฆืืืื ืื ืืื ืืืฉืืช ื ืืกืคืืช ืืืืืื ืงืื ืืงืฉืืจืืช ืฉืืืืชืืช LINQ.
ืื ืืืืข ืื LINQ(ืฉืืืืชื ืืฉืืืืช ืืฉืคื) ืืื ืฉืคื ืคืฉืืื ืื ืืื ืืฉืืืืชื ืฉื ืืงืืจ ื ืชืื ืื.
ะ LINQ ื- SQL ืืื ืืื ืืืืืื ืืืืฉื ืื ืชืื ืื ื-DBMS. ืืื ืืื ืจื ืขืืฆืื ืืขืืืื ืขื ื ืชืื ืื, ืฉืื ืฉืืืืชืืช ื ืื ืืช ืืืืฆืขืืช ืฉืคื ืืฆืืจืชืืช, ืืฉืจ ืืืืจ ืืื ืชืืืจ ื- ืฉืืืืชืืช SQL ืคืืืคืืจืื ืื ืฉืื ืืฉืจืช ืืกื ืื ืชืื ืื ืืืืฆืืข. ืืืงืจื ืฉืื ื, ื-DBMS ืื ืื ื ืืชืืืื ืื MS SQL Server.
ืขื ืืืช, ืฉืืืืชืืช LINQ ืืื ื ืืืืจืื ืืืชืืืื ืืฆืืจื ืืืืืืช ืฉืืืืชืืช SQL, ืฉ-DBA ืื ืืกื ืืืื ืืืชืื ืขื ืื ืื ืืืื ืกืื ืฉื ืืืคืืืืืืฆืื ืฉืืืืชืืช SQL:
- ืืืืืจืื ืืืคืืืืืืื (ืืืฆืืจืฃ) ืืกืื ืื ืืชืืฆืืืช (ืืืคื)
- ื ืืืื ืกืื ืจืืื ืืฉืืืืฉ ืืงืฉืจืื ืืืชื ืืื ืงืืืฆืชืืื
- ืืจืืืฆืืืช ืจืืืช ืืืืืคืช ืชื ืืื IN ืขื EXISTSะธ ืื ื, <> ืคืืขื EXISTS
- ืืืืื ืืื ืืื ืฉื ืชืืฆืืืช ืืืืฆืขืืช ืืืืืืช ืืื ืืืช, CTE, ืืฉืชื ื ืืืื
- ืฉืืืืฉ ืืืฉืคื (ืืึนืคึผึฐืฆึดืึธื) ืขื ืืืจืืืช ืืจืืืื ืืืืื ืขึดื (...)
- ืฉืืืืฉ ืืชืฆืืืืช ืืื ืืงืก ืืืื ืืืืฆืขืื ืืืืคืืจ ืืงืจืืืืช ื ืชืื ืื ืืืืชืจืืช ืืืืื ืืืืจืืช
ืฆืืืืจื ืืืงืืืง ืืขืืงืจืืื ืฉื ืืืืฆืืขืื ืืืชืงืืืื ืฉืืืืชืืช SQL ืืขืช ืืืืืจ ืฉืืืืชืืช LINQ ืื:
- ืืืืื ืฉื ืื ืื ืื ืื ืืืืจืช ืื ืชืื ืื ืืืงืฉื ืืืช
- ืฉืืคืื ืืืืงืื ืืืื ืฉื ืงืื, ืื ืฉืืืืื ืืกืืคื ืฉื ืืืจ ืืงืจืืืืช ื ืชืื ืื ืืืืชืจืืช ืืจืืืืช
- ืงืืืฆืืช ืฉื ืชื ืืื ืืจืืื ืจืืืืื ("ื" ื"ืื" ืืืืืื) - ื ะธ OR, ืฉืืืื ืืชื ืืื ืืืจืืืื, ืืืืื ืืขืืืื ืฉืืืืคืืืืืืจ, ืืขื ืืื ืืงืกืื ืื ืืงืืืฆืื ืืชืืืืื ืืฉืืืช ืืืจืืฉืื, ืืชืืื ืืกืืคื ืฉื ืืืจ ืืกืจืืง ืื ืื ืืืื ืืงืก ืืืงืืืฅ (ืกืจืืงืช ืืื ืืงืก) ืืคื ืงืืืฆืืช ืฉื ืชื ืืื
- ืงืื ืื ืขืืืง ืฉื ืฉืืืืชืืช ืืฉื ื ืืืคื ืืช ืื ืืชืื ืืืขืืืชื ืืืื ืืฆืืจืืช SQL ืื ืืชืื ืชืืื ืืช ืืฉืืืืชืืช ืืฆื ืืคืชืืื ื DBA
ืฉืืืืช ืืืืื
ืืขืช ื ืขืืืจ ืืฉืืจืืช ืืฉืืืืช ืืืคืืืืืืฆืื.
1) ืืืกืคื ืืืื ืืงืก
ืขืืืฃ ืืฉืงืื ืืกื ื ืื ืืืืืืืช ืืืืืจื ืืจืืฉืืืช, ืืืืืื ืฉืืขืชืื ืงืจืืืืช ืื ืืฉืืืืชื ืื ืืื ืกืืื ืืืื ืจืืฉืืช ืืืช ืื ืฉืชืืื (ืืคืืืงืฆืืืช-ืื ืฉืื-ืคืขืืืืช) ืืขื ืืขืจืืช ืกืื ืืจืืืช ืฉื ืชื ืืื (IsClosed, Canceled, Enabled, Status). ืืฉืื ืืืฆืืจ ืืืืื ืืชืืืืื ืืืืืืืช ืฉืืืื.
ืคืชืจืื ืื ืืืืื ื ืืืฉืจ ืืืืจื ืืฉืืืช ืืื ืืืืืื ืืืืคื ืืฉืืขืืชื ืืช ืืกื ืืืืืืจ ืืฉืืืืชื.
ืืืืืื, ืืฉ ืื ื 500000 ืืืฉืืืื. ืขื ืืืช, ืืฉ ืจืง 2000 ืืืฉืืืื ืคืขืืืื. ืืื ืืื ืืงืก ืฉื ืืืจ ื ืืื ืืฆืื ืืืชื ื ืกืจืืงืช ืืื ืืงืก ืขื ืืืื ืืืืื ืืืืคืฉืจ ืื ืืืืืจ ื ืชืื ืื ืืืืืจืืช ืืืืฆืขืืช ืืื ืืงืก ืื ืืงืืืฅ.
ืืื ืื, ื ืืชื ืืืืืช ืืช ืืืขืืจ ืืืื ืืงืกืื ืืืืฆืขืืช ืื ืืืืช ืื ืืชืื ืชืืื ืืืช ืฉืืืืชืืช ืื ืืืกืืฃ ืกืืืืกืืืงืืช ืฉื ืชืฆืืืืช ืืขืจืืช MS SQL Server:
ืื ื ืชืื ื ืืชืฆืืื ืืืืืื ืืืืข ืขื ืืื ืืงืกืื ืืกืจืื, ืืืขื ืืื ืืงืกืื ืืจืืืืื.
ืขื ืืืช, ืืื ืืงืกืื ืืฉืืืจืช ืืืืื ืื ืืขืชืื ืงืจืืืืช ืฉืืืืช ืืืืืื ืืืฉืืืืช ืฉื ืืชืืื ืืจืืขื ืฉืืืืชืืช LINQ ะธ ืฉืืืืชืืช SQL.
ืืคื ืฉืืจืื ืืชืจืืื ืืงืฉื ืฉื ืืืืื, ืืขืชืื ืงืจืืืืช ืืฉืื ืืขืกืง ืืืืฉื ืชืืื ืืช ืขืกืงืืืช ืืืืขืืื ืืกืืืืื. ืืืื, ืืงืฉืืช ืืืืืช ืืืขืืจืืช ืืจืื ืืจืงืข ืขื ืฉืืืจื ืืืืืื.
ืื ืืืฆืืง ืืืืงื, ืืืืืื ืฉืืืฉืชืืฉ ืื ืชืืื ืฆืจืื ืืช ืื ืชืื ืื ืืขืืื ืืื ืืืืชืจ ืืืฉ ืจืืช ืชืืืื ืืงืืืืช ืฉื ืืืฉืง ืืืฉืชืืฉ.
ืืืฉื ืื ืืืคืฉืจืช ืคืชืจืื ืฆืจืืื ืขืกืงืืื, ืื ืืกืืคื ืฉื ืืืจ ืืคืืืชื ืืช ืืืฆืืขื ืืขืจืืช ืืืืืข ืขื ืืื ืขืืืื ืคืชืจืื ืืช ืืืขืืืช ืคืฉืื.
ืืืื ืื ืืืืืจ ืฉืืชืืืื ืืืืคืืฉ ืืืจ ืืืื ืืงืกืื ืืืจืืฉืื ืืืืกืืฃ, ืืฆืขืืช SQL MS ืืืคืืืืืืฆืื ืขืฉืืื ืืืืืช ืฉืืืื, ืืืื ืืชื ืืื ืืืืื:
- ืื ืืืจ ืืฉ ืืื ืืงืกืื ืขื ืงืืืฆื ืืืื ืฉื ืฉืืืช
- ืื ืืฉืืืช ืืืืื ืืื ื ื ืืชื ืื ืืืื ืืงืก ืขืงื ืืืืืืช ืืืกืคื ืืืื ืืงืก (ืืชืืืจ ืืคืืจืื ืจื ืืืชืจ
ืืื ).
2) ืืืืื ืชืืื ืืช ืืชืืื ื ืืืฉื ืืืช
ืืคืขืืื ื ืืชื ืืืืืืฃ ืืื ืฉืืืช ืืืืื ืืืช, ืืืฉืืฉืื ืืกืืก ืืงืืืฆืช ืชื ืืื, ืขื ืืื ืืื ืกืช ืฉืื ืืืฉ ืืื.
ืื ื ืืื ืืืืืื ืขืืืจ ืฉืืืช ืกืืืืก, ืฉืื ืืืจื ืืื ืืื ืื ืืกืคืจ ืฉืื.
ืืืืืื:
IsClosed = 0 AND Cancelled = 0 ื-Enabled = 0 ืืืืืฃ ืขื ืืื ืกืืืืก = 1.
ืืื ืืืฆืืช ืชืืื ืช ืืืฆื ืืฉืื ืืื ืืืืืื ืฉืืกืืืืกืื ืืืื ืืืืืืกืื ืืืืื. ืืืืจ ืืื, ืืชืืื ื ืืืืฉื ืืื ืืชืืืกืคืช ืืืื ืืงืก.
ืืื ืคืชืจืื ืืกืืกื ืืืขืืืช ืืืืฆืืขืื, ืืืืืื ืฉืื ื ื ืืืฉืื ืื ืชืื ืื ืืื ืืืฉืืืื ืืืืชืจืื.
3) ืืชืืืฉืืช ืื ืืฃ
ืืืจืื ืืฆืขืจ, ื ืฉืืืืชืืช LINQ ืื ื ืืชื ืืืฉืชืืฉ ืืืืืืืช ืืื ืืืช, CTEs ืืืฉืชื ื ืืืื ืืฉืืจืืช.
ืขื ืืืช, ืืฉ ืืจื ื ืืกืคืช ืืืฆืข ืืืคืืืืืืฆืื ืขืืืจ ืืงืจื ืื - ืชืฆืืืืช ืืื ืืงืก.
ืงืืืฆืช ืืฆื (ืืืืืืื ืืืขืื) IsClosed = 0 AND Cancelled = 0 ื-Enabled = 0 (ืื ืงืืืฆื ืฉื ืชื ืืื ืืืืื ืืืจืื) ืืืคืืช ืืืคืฉืจืืช ืืืื ืืืฉืชืืฉ ืืื ืืชืฆืืื ืืื ืืงืกืืช, ืชืื ืฉืืืจื ืืืืืื ืฉื ืคืจืืกื ืงืื ื ืฉื ื ืชืื ืื ืืงืืืฆื ืืืืื.
ืืื ืืฉื ื ืืกืคืจ ืืืืืืช ืืขืช ืืืืืฉ ืชืฆืืื:
- ืืืืฆืขืืช ืฉืืืืชืืช ืืฉื ื, ืกืขืืคืื EXISTS ืืฉ ืืืืืืฃ ืขื ืืื ืฉืืืืฉ ืืืฆืืจืฃ
- ืืชื ืื ืืืื ืืืฉืชืืฉ ืืืฉืคืืื ืืืื, UNION ALL, ืืืฆื ืื ืืืื, ืึฐืึดืฆึฐืึธืึตื
- ืืื ื ืืืื ืืืฉืชืืฉ ืืจืืืื ืืืกืขืืคืื ืืืืื ืืึนืคึผึฐืฆึดืึธื
- ืืื ืืคืฉืจืืช ืืขืืื ืขื ืืืืืจืื
- ืื ืืคืฉืจ ืืืฆืื ื ืชืื ืื ืืชืฆืืื ืืืช ืืืืืืืช ืฉืื ืืช
ืืฉืื ืืืืืจ ืฉืืช ืืชืืขืืช ืืืืืชืืช ืฉื ืฉืืืืฉ ืืชืฆืืืช ืืื ืืงืก ื ืืชื ืืืฉืื ืจืง ืขื ืืื ืืืกืคืชื ืืืื ืืงืก ืืคืืขื.
ืืื ืืขืช ืงืจืืื ืืชืฆืืื, ืืื ืืืฉืชืืฉ ืืืื ืืงืกืื ืืืื, ืืืื ืืืฉืชืืฉ ืืื ืืืคืืจืฉ, ืขืืื ืืฆืืื WITH(NOEXPAND).
ืืื ื ืฉืืืืชืืช LINQ ืื ืืคืฉืจ ืืืืืืจ ืจืืืื ืืืืื, ืื ืืชื ืฆืจืื ืืืฆืืจ ืืืฆืื ืืืจ - "ืขืืืคื" ืืืฆืืจื ืืืื:
CREATE VIEW ะะะฏ_ะฟัะตะดััะฐะฒะปะตะฝะธั AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);
4) ืฉืืืืฉ ืืคืื ืงืฆืืืช ืืืื
ืืขืชืื ืงืจืืืืช ื ืฉืืืืชืืช LINQ ืืืืงืื ืืืืืื ืฉื ืฉืืืืชืืช ืืฉื ื ืื ืืืืงืื ืืืฉืชืืฉืื ืืชืฆืืืืช ืืขืืืช ืืื ื ืืืจืื ืืืฆืจืื ืฉืืืืชื ืกืืคืืช ืขื ืืื ื ืืืฆืืข ืืืจืื ืืืื ืืื ืืืคืืืืื.
ืืืชืจืื ืืช ืืขืืงืจืืื ืฉื ืฉืืืืฉ ืืคืื ืงืฆืืืช ืืืื ื ืฉืืืืชืืช LINQ:
- ืืืืืืช, ืืื ืืืงืจื ืฉื ืชืฆืืืืช, ืืฉืืฉ ืืืฆืืื ืืืืืืืงื, ืืื ืืชื ืืืื ืืืขืืืจ ืงืืืฆื ืฉื ืคืจืืืจื ืงืื:
FROM FUNCTION(@param1, @param2 ...)
ืืชืืฆืื ืืื, ื ืืชื ืืืฉืื ืืืืืช ื ืชืื ืื ืืืืฉื - ืืืงืจื ืฉื ืฉืืืืฉ ืืคืื ืงืฆืืืช ืืืื, ืืื ืืืืืืช ืื ืืืงืืช ืืื ืืืงืจื ืฉื ืชืฆืืืืช ืืื ืืงืก ืืืชืืืจืืช ืืขืื:
- ืจืืืื ืืืืื:
ืืจื LINQ ืืื ื ืืืื ืืฆืืื ืืืืื ืืื ืืงืกืื ืืฉ ืืืฉืชืืฉ ืืืงืืืข ืืช ืจืืช ืืืืื ืื ืชืื ืื ืืขืช ืืืฆืืข ืฉืืืืชื.
ืืื ืืคืื ืงืฆืื ืืฉ ืืช ืืืืืืืช ืืืื.
ืขื ืืคืื ืงืฆืื, ืืชื ืืืื ืืืฉืื ืชืืื ืืช ืฉืืืืชืืช ืืืฆืืข ืงืืืขื ืืืื, ืฉืื ืืืืืจืื ืืืืื ืืขืืืื ืขื ืืื ืืงืกืื ืืจืืืช ืืืืื ื ืชืื ืื - ืืฉืืืืฉ ืืคืื ืงืฆืื ืืืคืฉืจ, ืืืฉืืืื ืืชืฆืืืืช ืฉื ืืกืคื ืืืื ืืงืก, ืืืฉืื:
- ืืืืืงื ืืืจืืืช ืฉื ืืืืืช ื ืชืื ืื (ืืคืืื ืืืืฆืขืืช ืืืืืืช)
- ืฉืืืคืช ื ืชืื ืื ืืืืืืืช ืจืืืช ืืฉืื ืืช
- ะธัะฟะพะปัะทะพะฒะฐะฝะธะต ืืืื ะธ EXISTS
- ืจืืืื ืืืืื:
- ืืฆืขื ืืึนืคึผึฐืฆึดืึธื ืฉืืืืฉื ืืืื ืืืฉืจ ืื ื ืฆืจืืืื ืืกืคืง ืืงืจืช ืืงืืืืืช OPTION(MAXDOP N), ืกืืจ ืชืืื ืืช ืืืฆืืข ืืฉืืืืชื. ืืืืืื:
- ืืชื ืืืื ืืฆืืื ืืฆืืจื ืืืืฉ ืืคืืื ืฉื ืชืืื ืืช ืืฉืืืืชืืช ืืคืฉืจืืช (ืืืืืจ ืืืืฉ)
- ืืชื ืืืื ืืฆืืื ืื ืืืืฅ ืืช ืชืืื ืืช ืืฉืืืืชื ืืืฉืชืืฉ ืืกืืจ ืืืฆืืจืคืืช ืฉืฆืืื ืืฉืืืืชื ืืคืฉืจืืช (ืฆื ืืืคืืื)
ืคืจืืื ื ืืกืคืื ืขื ืืึนืคึผึฐืฆึดืึธื ืึฐืชืึผืึธืจ
ืืื . - ืฉืืืืฉ ืืคืจืืกืช ืื ืชืื ืื ืืืฆืืืฆืืช ืืื ืืจืฉืช ืืืืชืจ:
ืืื ืฆืืจื ืืืืกื ืืขืจืื ื ืชืื ืื ืืืืืื ืืืืืื ืื (ืืคื ืฉืงืืจื ืืชืฆืืืืช ืืื ืืงืก), ืฉืืื ืขืืืื ืฆืจืื ืืกื ื ืืช ืื ืชืื ืื ืืคื ืคืจืืืจ.
ืืืืืื, ืืฉ ืืืื ืฉืืืกื ื ืฉืื ืืืคื ื ืขืฉื ืฉืืืืฉ ืืฉืืืฉื ืฉืืืช (ื ื ื).ืืืืคื ืงืื ืื ืฆืืื ืื, ืืื ืืืงืฉืืช ืืฉ ืืฆื ืงืืืข 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 ืืืคืืืช ืืฉื ืืื.
ืืืืชืจืื ืืช ืืืจืืจืื ืื ื ืืงืืืื ืื:
- ืืจืืื ืืืืืช ืืขืืืก ืืงืจืืื,
- ืืคืืชื ืืฉืืขืืชืืช ืืกืืืจืืช ืืืกืืื
- ืฆืืฆืื ืืื ืืืกืืื ืืืืืฆืข ืืขืจืืื ืืงืืืืื
ืคืื
ืืืคืืืืืืฆืื ืืืืืื ืื ืขืืื ืฉื ืฉืืืืช ืืกื ื ืชืื ืื SQL MS ืืจื LINQ ืืื ืืขืื ืฉื ืืชื ืืคืชืืจ.
ืงืฉื ืืขืงืืืืช ืืฉืืืื ืืืื ืืขืืืื ืื.
ืืชืืืืช ืืชืืืื:
- ืืฉ ืฆืืจื ืืืืืง ืืช ืื ืชืื ืื ืฉืืืชื ืืืงืฉื ืขืืืืช (ืขืจืืื, ืกืืื ื ืชืื ืื ื ืืืจืื)
- ืืืฆืข ืืื ืืงืก ื ืืื ืฉื ื ืชืื ืื ืืื
- ืืืืง ืืช ื ืืื ืืช ืชื ืื ืืืฆืืจืคืืช ืืื ืืืืืืืช
ืืืืจืฆืืืช ืืืืคืืืืืืฆืื ืืืื ืืืื:
- ืืกืืก ืืืงืฉื ืืืืืืจ ืืช ืืกื ื ืืืงืฉืืช ืืจืืฉื
- ืืืจื ืขื ืืืืงืื ืฉื ืฉืืืืชืืช ืืืืืช ืื ืืชืื ืฆืืืช ืืชื ืืื
- ื-SSMS ืื GUI ืืืจ ืขืืืจ ืฉืจืช SQL ืืืืขื ืืช ืขืฆืื ืฉืืืืชืช SQL (ืืงืฆืืช ืืืกืื ื ืชืื ืื ืืื ืืื, ืื ืืืช ืืฉืืืืชื ืืืชืงืืืช ืืืืฆืขืืช ืืืกืื ืื (ืืืชืื ื ืืื))
- ืืฉืื ืืืืจืื, ืชืื ืืชืืกืกืืช ืขื ืืืชืงืื ืฉืืืืชืช SQL, ืืืื ื ื ืื ื ืืืืฉ ืฉืืืืชืช LINQ
ืืืชืงืื ืฉืืืืชืช LINQ ืฆืจืื ืืืืืช ืืื ืืืื ื ืืืืคืืืืื ืฉืืืื ืฉืืืืชืช SQL ืื ืงืืื 3.
ืชืืืืช
ืชืืื ืจืื ืืขืืืชืื
ืืงืืจ: www.habr.com