å°å ¥
Ð
ããã§ã¯ã以äžã«é¢é£ããã³ãŒãæé©åãžã®ããã€ãã®ã¢ãããŒãã玹ä»ããŸãã LINQã¯ãšãª.
ãããç¥ãããŠãã LINQ(èšèªçµ±åã¯ãšãª) ã¯ãããŒã¿ ãœãŒã¹ãã¯ãšãªããããã®ã·ã³ãã«ã§äŸ¿å©ãªèšèªã§ãã
Ð LINQ to SQL DBMS å ã®ããŒã¿ã«ã¢ã¯ã»ã¹ããããã®ãã¯ãããžã§ããããã¯ããŒã¿ãæäœããããã®åŒ·åãªããŒã«ã§ãããã¯ãšãªã¯å®£èšåèšèªãéããŠæ§ç¯ããããã®åŸã次ã®ããã«å€æãããŸãã SQLã¯ãšãª ãã©ãããã©ãŒã ã«éä¿¡ãããå®è¡ã®ããã«ããŒã¿ããŒã¹ ãµãŒããŒã«éä¿¡ãããŸãããã®å ŽåãDBMS ãšã¯ MS SQL Server.
ãããã LINQã¯ãšãª æé©ã«æžããããã®ã«å€æãããªã SQLã¯ãšãªãçµéšè±å¯ãª DBA ã§ããã°ãæé©åã®ãããããã¥ã¢ã³ã¹ãå«ããŠæžãããšãã§ããŸãã SQL ã¯ãšãª:
- æé©ãªæ¥ç¶ (ç»é²) ããã³çµæã®ãã£ã«ã¿ãªã³ã° (WHERE)
- æ¥ç¶ãšã°ã«ãŒãæ¡ä»¶ã®äœ¿çšã«ãããå€ãã®ãã¥ã¢ã³ã¹
- 亀ææ¡ä»¶ã®ããªãšãŒã·ã§ã³ãè±å¯ IN Ма ååšããО ãããŸããã§ã<> äž ååšãã
- äžæããŒãã«ãCTEãããŒãã«å€æ°ã«ããçµæã®äžéãã£ãã·ã¥
- æã®äœ¿çš (ãªãã·ã§ã³) 説æãšè¡šã®ãã³ãä»ã WITH ïŒ...ïŒ
- éžæäžã®åé·ãªããŒã¿èªã¿åããåãé€ãæ段㮠XNUMX ã€ãšããŠã€ã³ããã¯ã¹ä»ããã¥ãŒã䜿çšãã
çµæãšããŠçããäž»ãªããã©ãŒãã³ã¹ã®ããã«ãã㯠SQL ã¯ãšãª ã³ã³ãã€ã«æ LINQã¯ãšãª 次ã®ãšããã§ãã
- ããŒã¿éžæã¡ã«ããºã å šäœã XNUMX ã€ã®ãªã¯ãšã¹ãã«çµ±å
- åäžã®ã³ãŒã ãããã¯ãè€è£œããæçµçã«ã¯è€æ°ã®äžèŠãªããŒã¿ã®èªã¿åãã«ã€ãªãã
- è€æ°ã®èŠçŽ ãããªãæ¡ä»¶ã®ã°ã«ãŒã (è«ççãªãandããšãorã) - ãã㊠О ORãè€éãªæ¡ä»¶ã«çµã¿åããããšããªããã£ãã€ã¶ãå¿ èŠãªãã£ãŒã«ãã«é©åãªéã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ãæã¡ãæçµçã«ã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ã«å¯ŸããŠã¹ãã£ã³ãéå§ãããšããäºå®ãçããŸã (ã€ã³ããã¯ã¹ã¹ãã£ã³) æ¡ä»¶ã®ã°ã«ãŒãããš
- ãµãã¯ãšãªã®ãã¹ããæ·±ãããã解æãéåžžã«åé¡ã«ãªããŸã SQLæ éçºè åŽã®ã¯ãšãª ãã©ã³ã®åæãš DBA
æé©åææ³
ããã§ã¯ãæé©åã¡ãœããã«çŽæ¥ç§»ããŸãããã
1) è¿œå ã®ã€ã³ããã¯ã¹äœæ
å€ãã®å Žåãã¯ãšãªå šäœã XNUMX ã€ãŸã㯠XNUMX ã€ã®ã¡ã€ã³ ããŒãã« (ã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒãæäœ) ãäžå¿ã«ãæšæºã®æ¡ä»¶ã»ãã (IsClosedãCanceledãEnabledãStatus) ã䜿çšããŠæ§ç¯ããããããã¡ã€ã³ã®éžæããŒãã«ã§ãã£ã«ã¿ãŒãæ€èšããããšããå§ãããŸããç¹å®ããããµã³ãã«ã«å¯ŸããŠé©åãªã€ã³ããã¯ã¹ãäœæããããšãéèŠã§ãã
ãããã®ãã£ãŒã«ããéžæãããšãã¯ãšãªã«è¿ãããã»ãããå€§å¹ ã«å¶éãããå Žåããã®ãœãªã¥ãŒã·ã§ã³ã¯æå³ããããŸãã
ããšãã°ã500000 件ã®ã¢ããªã±ãŒã·ã§ã³ããããŸãããã ããã¢ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã¯ 2000 件ãããããŸããã次ã«ãæ£ããéžæãããã€ã³ããã¯ã¹ã«ããã次ã®ãããªåé¡ãçºçããŸãã ã€ã³ããã¯ã¹ã¹ãã£ã³ 倧ããªããŒãã«ã®å Žåã¯ãéã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ã䜿çšããŠããŒã¿ããã°ããéžæã§ããŸãã
ãŸããã€ã³ããã¯ã¹ã®äžè¶³ã¯ãã¯ãšãª ãã©ã³ã®è§£æãŸãã¯ã·ã¹ãã ãã¥ãŒçµ±èšã®åéãæ±ããããã³ããã«ãã£ãŠç¹å®ã§ããŸãã MS SQL Server:
空éã€ã³ããã¯ã¹ãé€ãããã¹ãŠã®ãã¥ãŒ ããŒã¿ã«ã¯ãæ¬ èœããŠããã€ã³ããã¯ã¹ã«é¢ããæ å ±ãå«ãŸããŠããŸãã
ãã ããã€ã³ããã¯ã¹ãšãã£ãã·ã¥ã¯ãå€ãã®å Žåãäžé©åã«èšè¿°ãããå Žåã®åœ±é¿ã«å¯ŸåŠããæ¹æ³ã§ãã LINQã¯ãšãª О SQL ã¯ãšãª.
å³ããç掻ç¿æ £ã瀺ãããã«ãå€ãã®å ŽåãäŒæ¥ã«ãšã£ãŠãç¹å®ã®æéãŸã§ã«ããžãã¹æ©èœãå®è£ ããããšãéèŠã§ãããããã£ãŠãéããªã¯ãšã¹ãã¯ãã£ãã·ã¥ã䜿çšããŠããã¯ã°ã©ãŠã³ãã«è»¢éãããããšããããããŸãã
ãŠãŒã¶ãŒã¯å¿ ãããææ°ã®ããŒã¿ãå¿ èŠãšããããã§ã¯ãªãããŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã®å¿çæ§ã«ã¯èš±å®¹å¯èœãªã¬ãã«ããããããããã¯éšåçã«ã¯æ£åœåãããŸãã
ãã®ã¢ãããŒãã«ãããããžãã¹ ããŒãºã®è§£æ±ºã¯å¯èœã«ãªããŸãããåé¡ã®è§£æ±ºãé ããã ãã§ãæçµçã«ã¯æ å ±ã·ã¹ãã ã®ããã©ãŒãã³ã¹ãäœäžããŸãã
è¿œå ããå¿ èŠãããã€ã³ããã¯ã¹ãæ€çŽ¢ããéçšã§ãææ¡ãè¡ãããããšãèŠããŠãã䟡å€ããããŸãã MS SQL 次ã®ãããªæ¡ä»¶äžã§ã¯ãæé©åãæ£ããè¡ãããªãå¯èœæ§ããããŸãã
- åæ§ã®ãã£ãŒã«ãã®ã»ãããæã€ã€ã³ããã¯ã¹ããã§ã«ååšããå Žå
- ã€ã³ããã¯ã¹äœæã®å¶éã«ããããŒãã«å
ã®ãã£ãŒã«ãã«ã€ã³ããã¯ã¹ãäœæã§ããªãå Žå (詳现ã¯åŸè¿°)
ãã㧠).
2) å±æ§ã XNUMX ã€ã®æ°ããå±æ§ã«çµåãã
å Žåã«ãã£ãŠã¯ãæ¡ä»¶ã°ã«ãŒãã®åºç€ãšããŠæ©èœãã XNUMX ã€ã®ããŒãã«ã®äžéšã®ãã£ãŒã«ãããXNUMX ã€ã®æ°ãããã£ãŒã«ããå°å ¥ããããšã§çœ®ãæããããšãã§ããŸãã
ããã¯ãã¹ããŒã¿ã¹ ãã£ãŒã«ãã«ç¹ã«åœãŠã¯ãŸããŸããã¹ããŒã¿ã¹ ãã£ãŒã«ãã¯éåžžããããåãŸãã¯æŽæ°åã§ãã
äŸïŒ
IsClosed = 0 ãã€ãã£ã³ã»ã«æžã¿ = 0 ãã€æå¹ = 0 ã«çœ®ãæãããã ã¹ããŒã¿ã¹ = 1.
ããã§ã¯ããããã®ã¹ããŒã¿ã¹ãããŒãã«ã«ç¢ºå®ã«å ¥åãããããã«ããããã«ãæŽæ°ã® Status å±æ§ãå°å ¥ãããŠããŸãã次ã«ããã®æ°ããå±æ§ã«ã€ã³ããã¯ã¹ãä»ããããŸãã
äžå¿ èŠãªèšç®ãè¡ããã«ããŒã¿ã«ã¢ã¯ã»ã¹ãããããããã¯ããã©ãŒãã³ã¹ã®åé¡ã«å¯Ÿããæ ¹æ¬çãªè§£æ±ºçã§ãã
3) ãã¥ãŒã®å ·äœå
æ®å¿µãªããã LINQã¯ãšãª äžæããŒãã«ãCTEãããŒãã«å€æ°ã¯çŽæ¥äœ¿çšã§ããŸããã
ãã ãããã®å Žåã«æé©åããå¥ã®æ¹æ³ãã€ãŸãã€ã³ããã¯ã¹ä»ããã¥ãŒããããŸãã
æ¡ä»¶ã°ã«ãŒã (äžèšã®äŸãã) IsClosed = 0 ãã€ãã£ã³ã»ã«æžã¿ = 0 ãã€æå¹ = 0 (ãŸãã¯ä»ã®åæ§ã®æ¡ä»¶ã®ã»ãã) ã¯ãã€ã³ããã¯ã¹ä»ããã¥ãŒã§ãããã䜿çšãã倧èŠæš¡ãªã»ããããããŒã¿ã®å°ããªã¹ã©ã€ã¹ããã£ãã·ã¥ããããã®è¯ããªãã·ã§ã³ã«ãªããŸãã
ãã ãããã¥ãŒãå®äœåããå Žåã«ã¯ãããã€ãã®å¶éããããŸãã
- ãµãã¯ãšãªãå¥ã®äœ¿çš ååšãã ã䜿çšããŠçœ®ãæããå¿ èŠããããŸã ç»é²
- æç« ã¯äœ¿ããªã é£å, UNION ALL, äŸå€, 亀差ãã
- ããŒãã«ã®ãã³ããšå¥ã¯äœ¿çšã§ããŸãã ãªãã·ã§ã³
- ãµã€ã¯ã«ãæ±ãå¯èœæ§ã¯ãããŸãã
- ç°ãªãããŒãã«ã®ããŒã¿ã XNUMX ã€ã®ãã¥ãŒã«è¡šç€ºããããšã¯ã§ããŸãã
ã€ã³ããã¯ã¹ä»ããã¥ãŒã䜿çšããæ¬åœã®ã¡ãªããã¯ãå®éã«ã€ã³ããã¯ã¹ãäœæããããšã«ãã£ãŠã®ã¿åŸãããããšãèŠããŠããããšãéèŠã§ãã
ãã ãããã¥ãŒãåŒã³åºãå Žåããããã®ã€ã³ããã¯ã¹ã¯äœ¿çšã§ããªãå Žåããããæ瀺çã«äœ¿çšããã«ã¯ã次ã®ããã«æå®ããå¿ èŠããããŸãã ãã(æ¡åŒµãªã).
ä»¥æ¥ LINQã¯ãšãª ããŒãã« ãã³ããå®çŸ©ããããšã¯äžå¯èœãªã®ã§ãå¥ã®è¡šçŸãã€ãŸã次ã®åœ¢åŒã®ãã©ãããŒããäœæããå¿ èŠããããŸãã
CREATE VIEW ÐÐЯ_пÑеЎÑÑÐ°Ð²Ð»ÐµÐœÐžÑ AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);
4) ããŒãã«é¢æ°ã®äœ¿çš
ãã°ãã° LINQã¯ãšãª ãµãã¯ãšãªã®å€§ããªãããã¯ããŸãã¯è€éãªæ§é ã®ãã¥ãŒã䜿çšãããããã¯ã¯ãéåžžã«è€éã§æ¬¡åã®å®è¡æ§é ãæã€æçµçãªã¯ãšãªã圢æããŸãã
ããŒãã«é¢æ°ã䜿çšããäž»ãªå©ç¹ LINQã¯ãšãª:
- ãã¥ãŒã®å Žåãšåæ§ã«ããªããžã§ã¯ããšããŠäœ¿çšããã³æå®ã§ããæ©èœã§ãããäžé£ã®å
¥åãã©ã¡ãŒã¿ãæž¡ãããšãã§ããŸãã
FROM FUNCTION(@param1, @param2 ...)
ããã«ãããæè»ãªããŒã¿ãµã³ããªã³ã°ãå¯èœã«ãªããŸãã - ããŒãã«é¢æ°ã䜿çšããå Žåãäžèšã®ã€ã³ããã¯ã¹ä»ããã¥ãŒã®å Žåã®ãããªåŒ·ãå¶éã¯ãããŸããã
- ããŒãã«ã®ãã³ã:
ã¹ã«ãŒ LINQ ã¯ãšãªæã«äœ¿çšããã€ã³ããã¯ã¹ãæå®ããããããŒã¿åé¢ã¬ãã«ã決å®ãããããããšã¯ã§ããŸããã
ãããããã®é¢æ°ã«ã¯ãããã®æ©èœããããŸãã
ãã®é¢æ°ã䜿çšãããšãã€ã³ããã¯ã¹ãšããŒã¿åé¢ã¬ãã«ãæäœããããã®ã«ãŒã«ãå®çŸ©ãããŠãããã»ãŒäžå®ã®å®è¡ã¯ãšãª ãã©ã³ãå®çŸã§ããŸãã - ãã®é¢æ°ã䜿çšãããšãã€ã³ããã¯ã¹ä»ããã¥ãŒãšæ¯èŒããŠã以äžãååŸã§ããŸãã
- è€éãªããŒã¿ ãµã³ããªã³ã° ããžã㯠(ã«ãŒãã䜿çšããå Žåãå«ã)
- ããŸããŸãªããŒãã«ããããŒã¿ããã§ãããã
- ã®äœ¿çš é£å О ååšãã
- ããŒãã«ã®ãã³ã:
- ææ¡ ãªãã·ã§ã³ åæå®è¡å¶åŸ¡ãæäŸããå¿
èŠãããå Žåã«éåžžã«åœ¹ç«ã¡ãŸã ãªãã·ã§ã³(MAXDOP N)ãã¯ãšãªå®è¡ãã©ã³ã®é åºãäŸãã°ïŒ
- ã¯ãšãªãã©ã³ã®åŒ·å¶åäœæãæå®ã§ããŸãã ãªãã·ã§ã³ (åã³ã³ãã€ã«)
- ã¯ãšãªã§æå®ãããçµåé åºãã¯ãšãª ãã©ã³ã§åŒ·å¶çã«äœ¿çšãããã©ãããæå®ã§ããŸãã ãªãã·ã§ã³ïŒåŒ·å¶åœä»€ïŒ
詳现ã«ã€ããŠã¯ã ãªãã·ã§ã³ 説æããã
ãã㧠. - æãçããæãå¿
èŠãªããŒã¿ ã¹ã©ã€ã¹ã䜿çšããŸãã
(ã€ã³ããã¯ã¹ä»ããã¥ãŒã®å Žåã®ããã«) 倧ããªããŒã¿ ã»ããããã£ãã·ã¥ã«ä¿åããå¿ èŠã¯ãªãããã£ãã·ã¥ãããã©ã¡ãŒã¿ã§ããŒã¿ããã£ã«ã¿ãªã³ã°ããå¿ èŠããããŸãã
ããšãã°ããã£ã«ã¿ãŒãé©çšãããããŒãã«ããããŸãã WHERE XNUMXã€ã®ãã£ãŒã«ãã䜿çšãããŸã (aãbãc).åŸæ¥ããã¹ãŠã®ãªã¯ãšã¹ãã«ã¯äžå®ã®æ¡ä»¶ããããŸãã a = 0 ããã³ b = 0.
ãã ãããã£ãŒã«ããžã®ãªã¯ãšã¹ãã¯ã c ããå€åããããã
æ¡ä»¶ãä»ããŸããã a = 0 ããã³ b = 0 ããã¯ãå¿ èŠãªçµæã»ãããæ°åã®ã¬ã³ãŒãã«å¶éããã®ã«éåžžã«åœ¹ç«ã¡ãŸããã Ñ éžæã XNUMX 件ã®ã¬ã³ãŒãã«çµã蟌ã¿ãŸãã
ããã§ã¯ããŒãã«é¢æ°ã®æ¹ãè¯ããããããŸããã
ãŸããããŒãã« é¢æ°ã¯å®è¡æéã®äºæž¬å¯èœæ§ãé«ããäžè²«æ§ããããŸãã
äŸ
äŸãšããŠè³ªåããŒã¿ããŒã¹ã䜿çšããå®è£ äŸãèŠãŠã¿ãŸãããã
ãªã¯ãšã¹ãããããŸã SELECTãè€æ°ã®ããŒãã«ãçµåããXNUMX ã€ã®ãã¥ãŒ (OperativeQuestions) ã䜿çšããŸããæå±ã¯é»åã¡ãŒã« (çµç±) ã§ãã§ãã¯ãããŸãã ååšãã)ãæäœäžã®è³ªåã:
èŠæNo.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 ã®ãµã³ãã«ã¯çŽ XNUMX äžä»¶ã®ã¬ã³ãŒãã§ãã
ãã®ã¯ãšãªã®äž»ãªåé¡ã¯ãå€éšã¯ãšãªããã®ã¬ã³ãŒãã«å¯ŸããŠãå éšãµãã¯ãšãªã [OperativeQuestions] ãã¥ãŒã§å®è¡ãããããšã§ããããã«ããã[Email] = @p__linq__0 ã®å Žåãåºåéžæãå¶éã§ããããã«ãªããŸã (çµç±) ååšãã) æ倧æ°çŸã®ã¬ã³ãŒãã
ãŸãããµãã¯ãšãªã§ã¯ [Email] = @p__linq__0 ã«ãã£ãŠã¬ã³ãŒãã XNUMX åèšç®ãããã®åŸããããã®æ°çŸã®ã¬ã³ãŒãã ID ãšè³ªåã«ãã£ãŠæ¥ç¶ããå¿ èŠããããã¯ãšãªã¯é«éã«ãªãããã«æããããããããŸããã
å®éããã¹ãŠã®ããŒãã«ã«ã¯é 次æ¥ç¶ããããID 質åãš OperativeQuestions ããã® ID ã®å¯Ÿå¿ã確èªããé»åã¡ãŒã«ã§ãã£ã«ã¿ãªã³ã°ããŸãã
å®éããã®ãªã¯ãšã¹ãã¯äœäžãã® OperativeQuestions ã¬ã³ãŒããã¹ãŠãåŠçããŸãããé»åã¡ãŒã«çµç±ã§å¿ èŠãªã®ã¯é¢å¿ã®ããããŒã¿ã®ã¿ã§ãã
OperativeQuestions ãã¥ãŒã®ããã¹ã:
èŠæNo.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();
ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®å€æŽãè¡ãããæ¢è£œã®çµæ (ãã¢ã¯ãã£ã ã¯ãšãªã) ãå«ãå¥ã®ããŒãã«ãå°å ¥ããã«ããã®åé¡ã®è§£æ±ºçãæ€èšããŠããŸããããŒãã«ã«ããŒã¿ãå ¥åããŠææ°ã®ç¶æ ã«ä¿ã€ããã®ã¡ã«ããºã ãå¿ èŠã«ãªããŸãã ã
ããã¯è¯ã解決çã§ããããã®åé¡ãæé©åããå¥ã®ãªãã·ã§ã³ããããŸãã
äž»ãªç®çã¯ãOperativeQuestions ãã¥ãŒãã [Email] = @p__linq__0 ã«ãããšã³ããªããã£ãã·ã¥ããããšã§ãã
ããŒãã«é¢æ° [dbo].[OperativeQuestionsUserMail] ãããŒã¿ããŒã¹ã«å°å ¥ããŸãã
é»åã¡ãŒã«ãå ¥åãã©ã¡ãŒã¿ãŒãšããŠéä¿¡ãããšãå€ã®ããŒãã«ãè¿ãããŸãã
èŠæNo.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 ã«å€æãããŸãã
èŠæNo.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 ããªç§ã«ãªããŸãã
æãããªå©ç¹ããã次ã®ãããªã¡ãªãããåŸãããŸãã
- èªã¿åãè² è·ã®å šäœçãªè»œæžã
- ãããã¯ãããå¯èœæ§ãå€§å¹ ã«æžå°ããŸã
- å¹³åããããã³ã°æéã蚱容å€ãŸã§ççž®ãã
åºå
ããŒã¿ããŒã¹åŒã³åºãã®æé©åãšåŸ®èª¿æŽ MS SQL ã¹ã«ãŒ LINQ 解決ã§ããåé¡ã§ãã
ãã®ä»äºã§ã¯ã泚æåãšäžè²«æ§ãéåžžã«éèŠã§ãã
ããã»ã¹ã®éå§æ:
- ãªã¯ãšã¹ããæ©èœããããŒã¿ (å€ãéžæãããããŒã¿å) ã確èªããå¿ èŠããããŸãã
- ãã®ããŒã¿ã®é©åãªã€ã³ããã¯ã¹ä»ããå®è¡ãã
- ããŒãã«éã®çµåæ¡ä»¶ã®æ£ç¢ºæ§ããã§ãã¯ãã
次ã®æé©åå埩ã«ããã次ã®ããšãæããã«ãªããŸãã
- ãªã¯ãšã¹ãã®åºç€ãäœæããã¡ã€ã³ã®ãªã¯ãšã¹ããã£ã«ã¿ãŒãå®çŸ©ããŸã
- åæ§ã®ã¯ãšãªãããã¯ãç¹°ãè¿ããæ¡ä»¶ã®äº€å·®ãåæãã
- SSMS ãŸãã¯ä»ã® GUI 㧠SQLãµãŒã㌠ããèªäœãæé©åããŸã SQLã¯ãšãª (äžéããŒã¿ ã¹ãã¬ãŒãžãå²ãåœãŠããã®ã¹ãã¬ãŒãžã䜿çšããŠçµæã®ã¯ãšãªãæ§ç¯ããŸã (è€æ°ããå ŽåããããŸã))
- æçµæ®µéã§ã¯ããã®çµæãåºç€ãšããŠã SQLã¯ãšãªãæ§é ãåæ§ç¯ãããŠããŸã LINQã¯ãšãª
çµæãšã㊠LINQã¯ãšãª ç¹å®ãããæé©ãªãã®ãšæ§é ãåäžã«ãªãã¯ãã§ã SQLã¯ãšãª ãã€ã³ã3ããã
æè¬
ååã«æè¬ããŸã
åºæïŒ habr.com