ืžืขื˜ื”ืึธื“ืก ืคึฟืึทืจ ืึธืคึผื˜ื™ืžื™ื–ื™ื ื’ LINQ ืงื•ื•ื™ืจื™ื– ืื™ืŸ C#.NET

ื”ืงื“ืžื”

ะ’ ื“ืขื ืึทืจื˜ื™ืงืœ ืขื˜ืœืขื›ืข ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ ืžืขื˜ื”ืึธื“ืก ื–ืขื ืขืŸ ื’ืขื”ืืœื˜ืŸ LINQ ืคึฟืจืื’ืŸ.
ื“ืึธ ืžื™ืจ ืื•ื™ืš ืคืึธืจืฉื˜ืขืœืŸ ืขื˜ืœืขื›ืข ืžืขืจ ืึทืคึผืจืึธื•ื˜ืฉื™ื– ืฆื• ืงืึธื“ ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ ืฉื™ื™ึทื›ื•ืช ืฆื• LINQ ืคึฟืจืื’ืŸ.

ืขืก ืื™ื– ื‘ืึทื•ื•ื•ืกื˜ ืึทื– LINQ(ืฉืคึผืจืึทืš-ื™ื ืึทื’ืจื™ื™ื˜ื™ื“ ืึธื ืคึฟืจืขื’) ืื™ื– ืึท ืคึผืฉื•ื˜ ืื•ืŸ ื‘ืึทืงื•ื•ืขื ืฉืคึผืจืึทืš ืคึฟืึทืจ ืงื•ื•ืขืจื™ื ื’ ืึท ื“ืึทื˜ืŸ ืžืงื•ืจ.

ะ LINQ ืฆื• SQL ืื™ื– ืึท ื˜ืขื›ื ืึธืœืึธื’ื™ืข ืคึฟืึทืจ ืึทืงืกืขืก ื“ืึทื˜ืŸ ืื™ืŸ ืึท DBMS. ื“ืึธืก ืื™ื– ืึท ืฉื˜ืึทืจืง ื’ืขืฆื™ื™ึทื’ ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ืึทื˜ืŸ, ื•ื•ื• ืคึฟืจืื’ืŸ ื–ืขื ืขืŸ ืงืึทื ืกื˜ืจืึทืงื˜ืึทื“ ื“ื•ืจืš ืึท ื“ืขืงืœืึทืจืึทื˜ื™ื•ื•ืข ืฉืคึผืจืึทืš, ื•ื•ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืงืึธื ื•ื•ืขืจื˜ืขื“ ืื™ืŸ SQL ืคึฟืจืื’ืŸ ืคึผืœืึทื˜ืคืึธืจืžืข ืื•ืŸ ื’ืขืฉื™ืงื˜ ืฆื• ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืกืขืจื•ื•ืขืจ ืคึฟืึทืจ ื“ื•ืจื›ืคื™ืจื•ื ื’. ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคืึทืœ, ืžื™ืจ ืžื™ื™ื ืขืŸ ื“ื•ืจืš DBMS ืžืก ืกืงืœ ืกืขืจื•ื•ื™ืจืขืจ.

ืื‘ืขืจ, LINQ ืคึฟืจืื’ืŸ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืงืึธื ื•ื•ืขืจื˜ืขื“ ืื™ืŸ ืึธืคึผื˜ื™ืžืึทืœืœื™ ื’ืขืฉืจื™ื‘ืŸ ืึธื ืขืก SQL ืคึฟืจืื’ืŸ, ื•ื•ืึธืก ืึท ื™ืงืกืคึผื™ืจื™ืึทื ืกื˜ ื“ื‘ืึท ืงืขืŸ ืฉืจื™ื™ึทื‘ืŸ ืžื™ื˜ ืึทืœืข ื“ื™ ื ื•ืึทื ืกื™ื– ืคื•ืŸ ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ SQL ืคึฟืจืื’ืŸ:

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

ื“ื™ ื”ื•ื™ืคึผื˜ ืคืึธืจืฉื˜ืขืœื•ื ื’ ื‘ืึทื˜ืึทืœื ืขืงืก ืคื•ืŸ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ SQL ืคึฟืจืื’ืŸ ื•ื•ืขืŸ ืงืึทืžืคึผื™ื™ืœื™ื ื’ LINQ ืคึฟืจืื’ืŸ ื–ืขื ืขืŸ:

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

ืึธืคึผื˜ื™ืžื™ื–ืึทื˜ื™ืึธืŸ ืžืขื˜ื”ืึธื“ืก

ืื™ืฆื˜ ืœืึธื–ืŸ ืก ืžืึทืš ื’ืœื™ื™ืš ืฆื• ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ ืžืขื˜ื”ืึธื“ืก.

1) ื ืึธืš ื™ื ื“ืขืงืกื™ื ื’

ืขืก ืื™ื– ื‘ืขืกื˜ืขืจ ืฆื• ื‘ืึทื˜ืจืึทื›ื˜ืŸ ืคื™ืœื˜ืขืจืก ืื•ื™ืฃ ื“ื™ ื”ื•ื™ืคึผื˜ ืกืขืœืขืงืฆื™ืข ื˜ื™ืฉืŸ, ื•ื•ื™ื™ึทืœ ืึธืคื˜ ื“ื™ ื’ืื ืฆืข ืึธื ืคึฟืจืขื’ ืื™ื– ื’ืขื‘ื•ื™ื˜ ืึทืจื•ื ืื™ื™ืŸ ืึธื“ืขืจ ืฆื•ื•ื™ื™ ื”ื•ื™ืคึผื˜ ื˜ื™ืฉืŸ (ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธื ืก-ืžืขื ื˜ืฉืŸ-ืึธืคึผืขืจืึทื˜ื™ืึธื ืก) ืื•ืŸ ืžื™ื˜ ืึท ื ืึธืจืžืึทืœ ื’ืึทื ื’ ืคื•ืŸ ื˜ื ืึธื™ื (ื™ืกืงืœืึธืกืขื“, ืงืึทื ืกืึทืœื“, ืขื ืึทื‘ืœืขื“, ืกื˜ืึทื˜ื•ืก). ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืฆื• ืฉืึทืคึฟืŸ ืฆื•ื ืขืžืขืŸ ื™ื ื“ื™ืกื™ื– ืคึฟืึทืจ ื“ื™ ื™ื™ื“ืขื ืึทืคื™ื™ื“ ืกืึทืžืคึผืึทืœื–.

ื“ื™ ืœื™ื™ื–ื•ื ื’ ืžืื›ื˜ ื–ื™ื ืขืŸ ื•ื•ืขืŸ ืกืึทืœืขืงื˜ื™ื ื’ ื“ื™ ืคืขืœื“ืขืจ ื‘ืื˜ื™ื™ื˜ื™ืง ืœื™ืžืึทืฅ ื“ื™ ืื•ืžื’ืขืงืขืจื˜ ืฉื˜ืขืœืŸ ืฆื• ื“ื™ ืึธื ืคึฟืจืขื’.

ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืžื™ืจ ื”ืึธื‘ืŸ 500000 ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ืึธื‘ืขืจ, ืขืก ื–ืขื ืขืŸ ื‘ืœื•ื™ื– 2000 ืึทืงื˜ื™ื•ื• ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ื“ืขืจื ืึธืš ืึท ืจื™ื›ื˜ื™ืง ืื•ื™ืกื’ืขืงืœื™ื‘ืŸ ืื™ื ื“ืขืงืก ื•ื•ืขื˜ ืจืึทื˜ืขื•ื•ืขืŸ ืื•ื ื“ื– ืคื•ืŸ ืื™ื ื“ืขืงืก ื™ื‘ืขืจืงื•ืงืŸ ืื•ื™ืฃ ืึท ื’ืจื•ื™ืก ื˜ื™ืฉ ืื•ืŸ ื•ื•ืขื˜ ืœืึธื–ืŸ ืื™ืจ ืฆื• ื’ืขืฉื•ื•ื™ื ื“ ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ื“ืึทื˜ืŸ ื“ื•ืจืš ืึท ื ื™ื˜-ืงืœืึทืกื˜ืขืจื“ ืื™ื ื“ืขืงืก.

ืื•ื™ืš, ื“ื™ ืคืขืœืŸ ืคื•ืŸ ื™ื ื“ืขืงืกื™ื– ืงืขื ืขืŸ ื–ื™ื™ืŸ ื™ื™ื“ืขื ืึทืคื™ื™ื“ ื“ื•ืจืš ืคึผืจืึทืžืคึผืก ืคึฟืึทืจ ืคึผืึทืจืกื™ื ื’ ืึธื ืคึฟืจืขื’ ืคึผืœืึทื ื– ืึธื“ืขืจ ืงืึทืœืขืงื˜ื™ื ื’ ืกื™ืกื˜ืขื ืžื™ื™ื ื•ื ื’ ืกื˜ืึทื˜ื™ืกื˜ื™ืง ืžืก ืกืงืœ ืกืขืจื•ื•ื™ืจืขืจ:

  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) ืฆื•ื ื•ื™ืคื’ื™ืกืŸ ืึทื˜ืจื™ื‘ื™ื•ืฅ ืื™ืŸ ืื™ื™ืŸ ื ื™ื™ึท ืึทื˜ืจื™ื‘ื™ื•ื˜

ืžืืœ ืขื˜ืœืขื›ืข ืคืขืœื“ืขืจ ืคื•ืŸ ืื™ื™ืŸ ื˜ื™ืฉ, ื•ื•ืึธืก ื“ื™ื ืขืŸ ื•ื•ื™ ืึท ื‘ืึทื–ืข ืคึฟืึทืจ ืึท ื’ืจื•ืคึผืข ืคื•ืŸ โ€‹โ€‹ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ, ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจื™ืคึผืœื™ื™ืกื˜ ื“ื•ืจืš ื™ื ื˜ืจืึธื•ื“ื•ืกื™ื ื’ ืื™ื™ืŸ ื ื™ื™ึท ืคืขืœื“.

ื“ืึธืก ืื™ื– ืกืคึผืขืฆื™ืขืœ ืืžืช ืคึฟืึทืจ ืกื˜ืึทื˜ื•ืก ืคืขืœื“ืขืจ, ื•ื•ืึธืก ื–ืขื ืขืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืึธื“ืขืจ ื‘ื™ืกืœ ืึธื“ืขืจ ื™ื ื˜ืึทื“ื–ืฉืขืจ ืื™ืŸ ื˜ื™ืคึผ.

ื‘ื™ื™ึทืฉืคึผื™ืœ:

ื™ืกืงืœืึธืกืขื“ = 0 ืื•ืŸ ืงืึทื ืกืึทืœื“ = 0 ืื•ืŸ ืขื ื™ื™ื‘ืึทืœื“ = 0 ืื™ื– ืจื™ืคึผืœื™ื™ืกื˜ ื“ื•ืจืš ืกื˜ืึทื˜ื•ืก = 1.

ื“ืึธืก ืื™ื– ื•ื•ื• ื“ื™ ื™ื ื˜ืึทื“ื–ืฉืขืจ ืกื˜ืึทื˜ื•ืก ืึทื˜ืจื™ื‘ื™ื•ื˜ ืื™ื– ื‘ืึทืงืขื ืขื  ืฆื• ืขื ืฉื•ืจ ืึทื– ื“ื™ ืกื˜ืึทื˜ื•ืกืขืก ื–ืขื ืขืŸ ืคึผืึทืคึผื™ืึทืœื™ื™ื˜ืึทื“ ืื™ืŸ ื“ื™ ื˜ื™ืฉ. ื“ืขืจื ืึธืš, ื“ืขื ื ื™ื™ึทืข ืึทื˜ืจื™ื‘ื™ื•ื˜ ืื™ื– ื™ื ื“ืขืงืกื˜.

ื“ืึธืก ืื™ื– ืึท ืคื•ื ื“ืึทืžืขื ื˜ืึทืœ ืœื™ื™ื–ื•ื ื’ ืฆื• ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคึผืจืึธื‘ืœืขื, ื•ื•ื™ื™ึทืœ ืžื™ืจ ืึทืงืกืขืก ื“ืึทื˜ืŸ ืึธืŸ ื•ืžื ื™ื™ื˜ื™ืง ื—ืฉื‘ื•ื ื•ืช.

3) ืžืึทื˜ืขืจื™ืึทืœื™ื–ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืžื™ื™ื ื•ื ื’

ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ืื™ืŸ LINQ ืคึฟืจืื’ืŸ ืฆื™ื™ื˜ื•ื•ื™ื™ืœื™ื’ืข ื˜ื™ืฉืŸ, CTEs ืื•ืŸ ื˜ื™ืฉ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืงืขื ืขืŸ ื ื™ื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื’ืœื™ื™ึทืš.

ืึธื‘ืขืจ, ืขืก ืื™ื– ืืŸ ืื ื“ืขืจ ื•ื•ืขื’ ืฆื• ืึทืคึผื˜ืึทืžื™ื™ื– ืคึฟืึทืจ ื“ืขื ืคืึทืœ - ื™ื ื“ืขืงืกื˜ ืงื•ืงืŸ.

ืฆื•ืฉื˜ืึทื ื“ ื’ืจื•ืคึผืข (ืคื•ืŸ ื“ื™ ื‘ื™ื™ืฉืคึผื™ืœ ืื•ื™ื‘ืŸ) ื™ืกืงืœืึธืกืขื“ = 0 ืื•ืŸ ืงืึทื ืกืึทืœื“ = 0 ืื•ืŸ ืขื ื™ื™ื‘ืึทืœื“ = 0 (ืึธื“ืขืจ ืึท ืกื›ื•ื ืคื•ืŸ ืื ื“ืขืจืข ืขื ืœืขืš ื˜ื ืึธื™ื) ื•ื•ืขืจื˜ ืึท ื’ื•ื˜ ืึธืคึผืฆื™ืข ืฆื• ื ื•ืฆืŸ ื–ื™ื™ ืื™ืŸ ืึท ื™ื ื“ืขืงืกื˜ ืžื™ื™ื ื•ื ื’, ืงืึทื˜ืฉื™ื ื’ ืึท ืงืœื™ื™ืŸ ืจืขืคื˜ืœ ืคื•ืŸ ื“ืึทื˜ืŸ ืคื•ืŸ ืึท ื’ืจื•ื™ืก ื’ืึทื ื’.

ืึธื‘ืขืจ ืขืก ื–ืขื ืขืŸ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืจื™ืกื˜ืจื™ืงืฉืึทื ื– ื•ื•ืขืŸ ืžืึทื˜ื™ืจื™ืึทืœื™ื™ื– ืึท ืžื™ื™ื ื•ื ื’:

  1. ื ื•ืฆืŸ ืคื•ืŸ ืกืึทื‘ืงื•ื•ืขืจื™ื–, ืงืœืึธื–ื™ื– ืขืงืกื™ืกื˜ืŸ ื–ืึธืœ ื–ื™ื™ืŸ ืจื™ืคึผืœื™ื™ืกื˜ ื“ื•ืจืš ื ื™ืฆืŸ ืคืึทืจื‘ื™ื ื“ืŸ
  2. ืื™ืจ ืงืขื ื˜ ื ื™ืฉื˜ ื ื•ืฆืŸ ื–ืืฆืŸ ืคืึทืจื‘ืึทื ื“, ื™ื•ื ื™ืึทืŸ ืึทืœืข, EXCEPTION, ื™ื ื˜ืขืจืกืขืงื˜
  3. ืื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ื ื•ืฆืŸ ื˜ื™ืฉ ื”ื™ื ืฅ ืื•ืŸ ืงืœืึธื–ื™ื– ืึธืคึผืฆื™ืข
  4. ืงื™ื™ืŸ ืžืขื’ืœืขื›ืงื™ื™ื˜ ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ืกื™ื™ืงืึทืœื–
  5. ืขืก ืื™ื– ืื•ืžืžืขื’ืœืขืš ืฆื• ื•ื•ื™ื™ึทื–ืŸ ื“ืึทื˜ืŸ ืื™ืŸ ืื™ื™ืŸ ืžื™ื™ื ื•ื ื’ ืคื•ืŸ ืคืึทืจืฉื™ื“ืขื ืข ื˜ื™ืฉืŸ

ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืฆื• ื’ืขื“ืขื ืงืขืŸ ืึทื– ื“ื™ ืคืึทืงื˜ื™ืฉ ื ื•ืฅ ืคื•ืŸ ื ื™ืฆืŸ ืึทืŸ ื™ื ื“ืขืงืกื˜ ืžื™ื™ื ื•ื ื’ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึทื˜ืฉื™ื•ื•ื“ ื‘ืœื•ื™ื– ื“ื•ืจืš ืึทืงืฉืœื™ ื™ื ื“ืขืงืกื™ื ื’ ืขืก.

ืึธื‘ืขืจ ื•ื•ืขืŸ ืื™ืจ ืจื•ืคืŸ ืึท ืžื™ื™ื ื•ื ื’, ื“ื™ ื™ื ื“ืขืงืกื™ื– ืงืขืŸ ื ื™ืฉื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜, ืื•ืŸ ืฆื• ื ื•ืฆืŸ ื–ื™ื™ ื‘ืคื™ืจื•ืฉ, ืื™ืจ ืžื•ื–ืŸ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืžื™ื˜ (ื ืึธืขืงืกืคึผืึทื ื“).

ื–ื™ื ื˜ ืื™ืŸ LINQ ืคึฟืจืื’ืŸ ืขืก ืื™ื– ืื•ืžืžืขื’ืœืขืš ืฆื• ื“ืขืคื™ื ื™ืจืŸ ื˜ื™ืฉ ื”ื™ื ืฅ, ืึทื–ื•ื™ ืื™ืจ ื”ืึธื‘ืŸ ืฆื• ืฉืึทืคึฟืŸ ืืŸ ืื ื“ืขืจ ืคืึทืจื˜ืจืขื˜ื•ื ื’ - ืึท "ืจืึทืคึผืขืจ" ืคื•ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืคืึธืจืขื:

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

4) ื ื™ืฆืŸ ื˜ื™ืฉ ืคืึทื ื’ืงืฉืึทื ื–

ืึธืคื˜ ืื™ืŸ LINQ ืคึฟืจืื’ืŸ ื’ืจื•ื™ืก ื‘ืœืึทืงืก ืคื•ืŸ ืกืึทื‘ืงื•ื•ืขืจื™ื– ืึธื“ืขืจ ื‘ืœืึทืงืก ื ื™ืฆืŸ ืงื•ืงืŸ ืžื™ื˜ ืึท ืงืึธืžืคึผืœืขืงืก ืกื˜ืจื•ืงื˜ื•ืจ ืคืึธืจืขื ืึท ืœืขืฆื˜ ืึธื ืคึฟืจืขื’ ืžื™ื˜ ืึท ื–ื™ื™ืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ืื•ืŸ ืกื•ื‘ืึธืคึผื˜ื™ืžืึทืœ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืกื˜ืจื•ืงื˜ื•ืจ.

ืฉืœื™ืกืœ ื‘ืขื ืขืคื™ืฅ ืคื•ืŸ ื ื™ืฆืŸ ื˜ื™ืฉ ืคืึทื ื’ืงืฉืึทื ื– ืื™ืŸ LINQ ืคึฟืจืื’ืŸ:

  1. ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜, ื•ื•ื™ ืื™ืŸ ื“ื™ ืคืึทืœ ืคื•ืŸ ืงื•ืงืŸ, ืฆื• ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื•ืŸ ืกืคึผืขืกื™ืคื™ืขื“ ื•ื•ื™ ืึท ื›ื™ื™ืคืขืฅ, ืึธื‘ืขืจ ืื™ืจ ืงืขื ืขืŸ ืคืึธืจืŸ ืึท ืกื›ื•ื ืคื•ืŸ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืคึผืึทืจืึทืžืขื˜ืขืจืก:
    ืคึฟื•ืŸ ืคึฟื•ื ืงืฆื™ืข (@param1, @param2 ...)
    ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืคืœืขืงืกืึทื‘ืึทืœ ื“ืึทื˜ืŸ ืžื•ืกื˜ืขืจื•ื ื’ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึทื˜ืฉื™ื•ื•ื“
  2. ืื™ืŸ ื“ืขื ืคืึทืœ ืคื•ืŸ ื ื™ืฆืŸ ืึท ื˜ื™ืฉ ืคึฟื•ื ืงืฆื™ืข, ืขืก ื–ืขื ืขืŸ ื ื™ื˜ ืึทื–ืึท ืฉื˜ืึทืจืง ืจื™ืกื˜ืจื™ืงืฉืึทื ื– ื•ื•ื™ ืื™ืŸ ื“ื™ ืคืึทืœ ืคื•ืŸ ื™ื ื“ืขืงืกื˜ ืงื•ืงืŸ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื•ื™ื‘ืŸ:
    1. ื˜ืึทื‘ืœืข ืขืฆื•ืช:
      ื“ื•ืจืš LINQ ืื™ืจ ืงืขื ื˜ ื ื™ืฉื˜ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื•ื•ืึธืก ื™ื ื“ืขืงืกื™ื– ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื•ืŸ ื‘ืึทืฉื˜ื™ืžืขืŸ ื“ื™ ื“ืึทื˜ืŸ ืืคื’ืขื–ื•ื ื“ืขืจื˜ืงื™ื™ื˜ ืžื“ืจื’ื” ื•ื•ืขืŸ ืื™ืจ ืคืจืขื’ืŸ.
      ืื‘ืขืจ ื“ื™ ืคื•ื ืงืฆื™ืข ื”ืื˜ ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื–.
      ืžื™ื˜ ื“ื™ ืคื•ื ืงืฆื™ืข, ืื™ืจ ืงืขื ืขืŸ ื“ืขืจื’ืจื™ื™ื›ืŸ ืึท ื’ืึทื ืฅ ืงืขืกื™ื™ื“ืขืจื“ื™ืง ื“ื•ืจื›ืคื™ืจื•ื ื’ ืึธื ืคึฟืจืขื’ ืคึผืœืึทืŸ, ื•ื•ื• ื›ึผืœืœื™ื ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื™ื ื“ืขืงืกื™ื– ืื•ืŸ ื“ืึทื˜ืŸ ืืคื’ืขื–ื•ื ื“ืขืจื˜ืงื™ื™ื˜ ืœืขื•ื•ืขืœืก ื–ืขื ืขืŸ ื“ื™ืคื™ื™ื ื“.
    2. ื ื™ืฆืŸ ื“ื™ ืคึฟื•ื ืงืฆื™ืข, ืื™ืŸ ืคืึทืจื’ืœื™ื™ึทืš ืžื™ื˜ ื™ื ื“ืขืงืกื˜ ืงื•ืงืŸ, ืฆื• ื‘ืึทืงื•ืžืขืŸ:
      • ืงืึธืžืคึผืœืขืงืก ื“ืึทื˜ืŸ ืžื•ืกื˜ืขืจื•ื ื’ ืœืึธื’ื™ืง (ืืคื™ืœื• ื ื™ืฆืŸ ืœื•ืคึผืก)
      • ื‘ืึทืงื•ืžืขืŸ ื“ืึทื˜ืŸ ืคื•ืŸ ืคื™ืœืข ืคืึทืจืฉื™ื“ืขื ืข ื˜ื™ืฉืŸ
      • ื ื™ืฆืŸ ืคืึทืจื‘ืึทื ื“ ะธ ืขืงืกื™ืกื˜ืŸ

  3. ืคืึธืจืฉืœืึธื’ ืึธืคึผืฆื™ืข ื–ื™ื™ืขืจ ื ื•ืฆื™ืง ื•ื•ืขืŸ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฆื•ืฉื˜ืขืœืŸ ืงืึทื ืงืขืจืึทื ืกื™ ืงืึธื ื˜ืจืึธืœ OPTION(MAXDOP N), ื“ืขืจ ืกื“ืจ ืคื•ืŸ ื“ื™ ืึธื ืคึฟืจืขื’ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืคึผืœืึทืŸ. ืœืžืฉืœ:
    • ืื™ืจ ืงืขื ืขืŸ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืึท ื’ืขืฆื•ื•ื•ื ื’ืขืŸ ืฉื™ื™ึทืขืš-ืฉืึทืคื•ื ื’ ืคื•ืŸ ื“ื™ ืึธื ืคึฟืจืขื’ ืคึผืœืึทืŸ ืึธืคึผืฆื™ืข (ืจื™ืงืึธืžืคึผื™ืœืข)
    • ืื™ืจ ืงืขื ืขืŸ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืฆื™ ืฆื• ืฆื•ื•ื™ื ื’ืขืŸ ื“ื™ ืึธื ืคึฟืจืขื’ ืคึผืœืึทืŸ ืฆื• ื ื•ืฆืŸ ื“ื™ ืคืึทืจื‘ื™ื ื“ืŸ ืกื“ืจ ืกืคึผืขืกื™ืคื™ืขื“ ืื™ืŸ ื“ื™ ืึธื ืคึฟืจืขื’ ืึธืคึผืฆื™ืข (ืงืจืึทืคื˜ ืกื“ืจ)

    ืžืขืจ ืคืจื˜ื™ื ื•ื•ืขื’ืŸ ืึธืคึผืฆื™ืข ื“ื™ืกืงืจื™ื™ื‘ื“ ื“ืึธ.

  4. ื ื™ืฆืŸ ื“ื™ ืฉืžืึธืœืึทืกื˜ ืื•ืŸ ืžืขืจืกื˜ ืคืืจืœืื ื’ื˜ ื“ืึทื˜ืŸ ืจืขืคื˜ืœ:
    ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืงืจืึธื ื’ืจื•ื™ืก ื“ืึทื˜ืŸ ืฉื˜ืขืœื˜ ืื™ืŸ ืงืึทื˜ืฉืขืก (ื•ื•ื™ ืื™ื– ื“ืขืจ ืคืึทืœ ืžื™ื˜ ื™ื ื“ืขืงืกื˜ ืงื•ืงืŸ), ืคึฟื•ืŸ ื•ื•ืึธืก ืื™ืจ ื ืึธืš ื“ืึทืจืคึฟืŸ ืฆื• ืคื™ืœื˜ืขืจ ื“ื™ ื“ืึทื˜ืŸ ื“ื•ืจืš ืคึผืึทืจืึทืžืขื˜ืขืจ.
    ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืขืก ืื™ื– ืึท ื˜ื™ืฉ ื•ื•ืขืžืขื ืก ืคื™ืœื˜ืขืจ ื•ื•ืื• ื“ืจื™ื™ ืคืขืœื“ืขืจ ื•ื•ืขืจืŸ ื’ืขื ื•ืฆื˜ (ืึท, ื‘, ื’).

    ืงืึทื ื•ื•ืขื ืฉืึทื ืึทืœื™, ืึทืœืข ืจื™ืงื•ื•ืขืก ื”ืึธื‘ืŸ ืึท ืงืขืกื™ื™ื“ืขืจื“ื™ืง ืฆื•ืฉื˜ืึทื ื“ ืึท = 0 ืื•ืŸ ื‘ = 0.

    ืึธื‘ืขืจ, ื“ื™ ื‘ืขื˜ืŸ ืคึฟืึทืจ ื“ื™ ืคืขืœื“ c ืžืขืจ ื•ื•ืขืจื™ืึทื‘ืึทืœ.

    ื–ืืœ ื“ื™ ืฆื•ืฉื˜ืึทื ื“ ืึท = 0 ืื•ืŸ ื‘ = 0 ืขืก ื˜ืึทืงืข ื”ืขืœืคึผืก ืื•ื ื“ื– ืฆื• ื‘ืึทื’ืจืขื ืขืฆืŸ ื“ื™ ืคืืจืœืื ื’ื˜ ืจื™ื–ืึทืœื˜ื™ื ื’ ืฉื˜ืขืœืŸ ืฆื• ื˜ื•ื™ื–ื ื˜ืขืจ ืคื•ืŸ ืจืขืงืึธืจื“ืก, ืึธื‘ืขืจ ื“ื™ ืฆื•ืฉื˜ืึทื ื“ ืื•ื™ืฃ ั ื ืขืจืึธื•ื– ื“ื™ ืกืขืœืขืงืฆื™ืข ืึทืจืึธืคึผ ืฆื• ืึท ื”ื•ื ื“ืขืจื˜ ืจืขืงืึธืจื“ืก.

    ื“ืึธ ื“ื™ ื˜ื™ืฉ ืคึฟื•ื ืงืฆื™ืข ืงืขืŸ ื–ื™ื™ืŸ ืึท ื‘ืขืกืขืจ ืึธืคึผืฆื™ืข.

    ืื•ื™ืš, ืึท ื˜ื™ืฉ ืคึฟื•ื ืงืฆื™ืข ืื™ื– ืžืขืจ ืคึผืจื™ื“ื™ืงื˜ืึทื‘ืึทืœ ืื•ืŸ ืงืึธื ืกื™ืกื˜ืขื ื˜ ืื™ืŸ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืฆื™ื™ื˜.

ืขืงืกืึทืžืคึผืœืขืก

ื–ืืœ ืก ืงื•ืง ืื™ืŸ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื“ื™ ืคึฟืจืื’ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืก ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ.

ืขืก ืื™ื– ืึท ื‘ืงืฉื” ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ, ื•ื•ืึธืก ืงืึทืžื‘ื™ื™ื ื– ืขื˜ืœืขื›ืข ื˜ื™ืฉืŸ ืื•ืŸ ื ื™ืฆื˜ ืื™ื™ืŸ ืžื™ื™ื ื•ื ื’ (OperativeQuestions), ืื™ืŸ ื•ื•ืึธืก ืึทืคื™ืœื™ื™ื™ืฉืึทืŸ ืื™ื– ืึธืคึผื’ืขืฉื˜ืขืœื˜ ื“ื•ืจืš E- ื‘ืจื™ื•ื• (ื“ื•ืจืš ืขืงืกื™ืกื˜ืŸ) ืฆื• "ืึทืงื˜ื™ื•ื•ืข ืคึฟืจืื’ืŸ" ([ืึธืคึผืขืจืึทื˜ื™ื•ื•ืข ืคึฟืจืื’ืŸ]):

ืคืืจืœืื ื’ ื ื•ืžืขืจ 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])
));

ื“ื™ ืžื™ื™ื ื•ื ื’ ื”ืื˜ ืึท ื’ืึทื ืฅ ืงืึธืžืคึผืœืขืงืก ืกื˜ืจื•ืงื˜ื•ืจ: ืขืก ื”ืื˜ ืกืึทื‘ืงื•ื•ืขืจื™ ื“ื–ืฉื•ื™ื ืฅ ืื•ืŸ ื ื™ืฆื˜ ืกืึธืจื˜ื™ื ื’ ื‘ื•ื™ืœืขื˜, ื•ื•ืึธืก ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ ืื™ื– ืึท ืคืขืจืœื™ ืžื™ื˜ืœ-ืื™ื ื˜ืขื ืกื™ื•ื•ืข ืึธืคึผืขืจืึทืฆื™ืข.

ื ืžื•ืกื˜ืขืจ ืคื•ืŸ OperativeQuestions ืื™ื– ื•ื•ืขื’ืŸ ืฆืขืŸ ื˜ื•ื™ื–ื ื˜ ืจืขืงืึธืจื“ืก.

ื“ืขืจ ื”ื•ื™ืคึผื˜ ืคึผืจืึธื‘ืœืขื ืžื™ื˜ ื“ืขื ืึธื ืคึฟืจืขื’ ืื™ื– ืึทื– ืคึฟืึทืจ ื“ื™ ืจืขืงืึธืจื“ืก ืคื•ืŸ ื“ื™ ื•ื™ืกื•ื•ื™ื™ื ื™ืงืกื˜ ืึธื ืคึฟืจืขื’, ืึทืŸ ื™ื ืขืจืœืขืš ืกืึทื‘ืงื•ื•ืขืจื™ ืื™ื– ืขืงืกืึทืงื™ื•ื˜ืึทื“ ืื•ื™ืฃ ื“ื™ [ืึธืคึผืขืจืึทื˜ื™ื•ื•ืข ืคึฟืจืื’ืŸ] ืžื™ื™ื ื•ื ื’, ื•ื•ืึธืก ื–ืึธืœ ืคึฟืึทืจ [Email] = @p__linq__0 ืœืึธื–ืŸ ืื•ื ื“ื– ืฆื• ื‘ืึทื’ืจืขื ืขืฆืŸ ื“ื™ ืคึผืจืึธื“ื•ืงืฆื™ืข ืกืขืœืขืงืฆื™ืข (ื“ื•ืจืš. ืขืงืกื™ืกื˜ืŸ) ื‘ื™ื– ื”ื•ื ื“ืขืจื˜ืขืจ ืจืขืงืืจื“ืก.

ืื•ืŸ ืขืก ืงืขืŸ ื•ื™ืกืงื•ืžืขืŸ ืึทื– ื“ื™ ืกืึทื‘ืงื•ื•ืขืจื™ ื–ืึธืœ ืจืขื›ืขื ืขืŸ ื“ื™ ืจืขืงืึธืจื“ืก ืึทืžืึธืœ ื“ื•ืจืš [Email] = @p__linq__0, ืื•ืŸ ื“ืึทืŸ ื“ื™ ืคึผืึธืจ ืคื•ืŸ ื”ื•ื ื“ืขืจื˜ ืจืขืงืึธืจื“ืก ื–ืึธืœ ื–ื™ื™ืŸ ืงืึธื ื ืขืงื˜ืขื“ ื“ื•ืจืš ID ืžื™ื˜ ืคึฟืจืื’ืŸ, ืื•ืŸ ื“ื™ ืึธื ืคึฟืจืขื’ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืฉื ืขืœ.

ืื™ืŸ ืคืึทืงื˜, ืขืก ืื™ื– ืึท ืกืึทืงื•ื•ืขื ื˜ืฉืึทืœ ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ ืคื•ืŸ ืึทืœืข ื˜ื™ืฉืŸ: ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืงืึธืจืขืกืคึผืึธื ื“ืขื ืฅ ืคื•ืŸ ืฉื™ื™ึทืŸ ืคึฟืจืื’ืŸ ืžื™ื˜ ืฉื™ื™ึทืŸ ืคึฟื•ืŸ ืึธืคึผืขืจืึทื˜ื™ื•ื•ืข ืคึฟืจืื’ืŸ ืื•ืŸ ืคึฟื™ืœื˜ืจื™ืจื•ื ื’ ื“ื•ืจืš E- ื‘ืจื™ื•ื•.

ืื™ืŸ ืคืึทืงื˜, ื“ื™ ื‘ืขื˜ืŸ ืึทืจื‘ืขื˜ ืžื™ื˜ ืึทืœืข ื˜ืขื ืก ืคื•ืŸ ื˜ื•ื™ื–ื ื˜ืขืจ ืคื•ืŸ ืึธืคึผืขืจืึทื˜ื™ื•ื•ืข ืคึฟืจืื’ืŸ ืจืขืงืึธืจื“ืก, ืึธื‘ืขืจ ื‘ืœื•ื™ื– ื“ื™ ื“ืึทื˜ืŸ ืคื•ืŸ ืื™ื ื˜ืขืจืขืก ืื™ื– ื“ืืจืฃ ื“ื•ืจืš E- ื‘ืจื™ื•ื•.

ืึธืคึผืขืจืึทื˜ื™ื•ื•ืข ืคึฟืจืื’ืŸ ืงื•ืง ื˜ืขืงืกื˜:

ืคืืจืœืื ื’ ื ื•ืžืขืจ 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 ืคึฟื•ืŸ ื“ื™ ืึธืคึผืขืจืึทื˜ื™ื•ื•ืข ืคึฟืจืื’ืŸ ืžื™ื™ื ื•ื ื’.

ื‘ืึทืงืขื ืขืŸ ื“ื™ ื˜ื™ืฉ ืคึฟื•ื ืงืฆื™ืข [ื“ื‘ืึธ].[OperativeQuestionsUserMail] ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก.

ื“ื•ืจืš ืฉื™ืงืŸ E- ื‘ืจื™ื•ื• ื•ื•ื™ ืึท ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืคึผืึทืจืึทืžืขื˜ืขืจ, ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืฆื•ืจื™ืง ืึท ื˜ื™ืฉ ืคื•ืŸ ื•ื•ืึทืœื•ืขืก:

ืคืืจืœืื ื’ ื ื•ืžืขืจ 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. ืจื™ื“ื•ืกื™ื ื’ ื“ื™ ื“ื•ืจื›ืฉื ื™ื˜ืœืขืš ื‘ืœืึทืงื™ื ื’ ืฆื™ื™ื˜ ืฆื• ืคึผืึทืกื™ืง ื•ื•ืึทืœื•ืขืก

ืจืขื–ื•ืœื˜ืึทื˜

ืึธืคึผื˜ื™ืžื™ื–ืึทื˜ื™ืึธืŸ ืื•ืŸ ืคื™ื™ืŸ-ื˜ื•ื ื™ื ื’ ืคื•ืŸ ื“ื™ื™ื˜ืึทื‘ื™ื™ืก ืงืึทืœืœืก MS SQL ื“ื•ืจืš LINQ ืื™ื– ืึท ืคึผืจืึธื‘ืœืขื ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืกืึทืœื•ื•ื“.

ืึทื˜ืขื ื˜ื™ื•ื•ื ืึทืก ืื•ืŸ ืงืึธื ืกื™ืกื˜ืขื ืกื™ ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ื•ื•ื™ื›ื˜ื™ืง ืื™ืŸ ื“ืขื ืึทืจื‘ืขื˜.

ืื™ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ืขื ืคึผืจืึธืฆืขืก:

  1. ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ื“ืึทื˜ืŸ ืžื™ื˜ ื•ื•ืึธืก ื“ื™ ื‘ืขื˜ืŸ ืึทืจื‘ืขื˜ (ื•ื•ืึทืœื•ืขืก, ืื•ื™ืกื’ืขืงืœื™ื‘ืŸ ื“ืึทื˜ืŸ ื˜ื™ื™ืคึผืก)
  2. ื“ื•ืจื›ืคื™ืจืŸ ื’ืขื”ืขืจื™ืง ื™ื ื“ืขืงืกื™ื ื’ ืคื•ืŸ ื“ื™ ื“ืึทื˜ืŸ
  3. ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืงืขืจืขืงื˜ื ืึทืก ืคื•ืŸ ื“ื–ืฉื•ื™ื ื™ื ื’ ื˜ื ืึธื™ื ืฆื•ื•ื™ืฉืŸ ื˜ื™ืฉืŸ

ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ ื™ื˜ืขืจืึทื˜ื™ืึธืŸ ืจื™ื•ื•ื™ืœื–:

  1. ื™ืงืขืจ ืคื•ืŸ ื“ื™ ื‘ืขื˜ืŸ ืื•ืŸ ื“ื™ืคื™ื™ื ื– ื“ื™ ื”ื•ื™ืคึผื˜ ื‘ืขื˜ืŸ ืคื™ืœื˜ืขืจ
  2. ืจื™ืคึผื™ื˜ื™ื ื’ ืขื ืœืขืš ืึธื ืคึฟืจืขื’ ื‘ืœืึทืงืก ืื•ืŸ ืึทื ืึทืœื™ื™ื–ื™ื ื’ ื“ื™ ื™ื ื˜ืขืจืกืขืงืฉืึทืŸ ืคื•ืŸ ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ
  3. ืื™ืŸ SSMS ืึธื“ืขืจ ืื ื“ืขืจืข GUI ืคึฟืึทืจ ืกืงืœ ืกืขืจื•ื•ื™ืจืขืจ ืึธืคึผื˜ื™ืžื™ื–ืขืก ื–ื™ืš SQL ืึธื ืคึฟืจืขื’ (ืึทืœืึธืงืึทื˜ื™ื ื’ ืึท ื™ื ื˜ืขืจืžื™ื“ื™ื™ื˜ ื“ืึทื˜ืŸ ืกื˜ืึธืจื™ื“ื–ืฉ, ื‘ื•ื™ืขืŸ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ืึธื ืคึฟืจืขื’ ื ื™ืฆืŸ ื“ืขื ืกื˜ืึธืจื™ื“ื–ืฉ (ืขืก ืงืขืŸ ื–ื™ื™ืŸ ืขื˜ืœืขื›ืข))
  4. ืื™ืŸ ื“ื™ ืœืขืฆื˜ืข ื‘ื™ื ืข, ื’ืขื ื•ืžืขืŸ ื•ื•ื™ ืึท ื™ืงืขืจ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ SQL ืึธื ืคึฟืจืขื’, ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ืื™ื– ืจื™ื‘ื™ืœื˜ LINQ ืึธื ืคึฟืจืขื’

ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ LINQ ืึธื ืคึฟืจืขื’ ื–ืึธืœ ื•ื•ืขืจืŸ ื™ื™ื“ืขื ื™ืงืึทืœ ืื™ืŸ ืกื˜ืจื•ืงื˜ื•ืจ ืฆื• ื“ื™ ื™ื™ื“ืขื ืึทืคื™ื™ื“ ืึธืคึผื˜ื™ืžืึทืœ SQL ืึธื ืคึฟืจืขื’ ืคื•ืŸ ืคื•ื ื˜ 3.

ืึทืงืงื ืึธื•ื•ืœืขื“ื’ืžืขื ืฅ

ื ื’ืจื•ื™ืกืŸ ื“ืื ืง ืคืืจ ื—ื‘ืจื™ื jobgemws ะธ alex_ozr ืคื•ืŸ ื“ื™ ืคื™ืจืžืข ืคืึธืจื˜ื™ืก ืคึฟืึทืจ ื”ื™ืœืฃ ืื™ืŸ ืคึผืจื™ืคึผืขืจื™ื ื’ ื“ืขื ืžืึทื˜ืขืจื™ืึทืœ.

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’