Π nkhaniyi njira zina zokometsera zinaganiziridwa LINQ mafunso.
Apa tikuwonetsanso njira zina zowonjezera ma code okhudzana ndi LINQ mafunso.
Zimadziwika kuti Zamgululi(Language-Integrated Query) ndi chilankhulo chosavuta komanso chosavuta kufunsa komwe kumachokera deta.
Π LINQ kupita ku SQL ndi teknoloji yopezera deta mu DBMS. Ichi ndi chida champhamvu chogwirira ntchito ndi data, pomwe mafunso amapangidwa kudzera muchilankhulo chofotokozera, chomwe chimasinthidwa kukhala Mafunso a SQL nsanja ndikutumizidwa ku seva ya database kuti ichitike. Kwa ife, ndi DBMS tikutanthauza MS SQL Server.
Komabe, LINQ mafunso sanasinthidwe kukhala olembedwa bwino lomwe Mafunso a SQL, yomwe DBA yodziwa bwino imatha kulemba ndi mitundu yonse ya kukhathamiritsa Mafunso a SQL:
Waukulu ntchito botolo la chifukwa Mafunso a SQL pokonza LINQ mafunso Ali:
kuphatikiza njira yonse yosankha deta mu pempho limodzi
kubwereza midadada yofanana ya ma code, zomwe pamapeto pake zimatsogolera ku kuwerenga kochuluka kosafunikira
magulu amitundu yambiri (zomveka "ndi" ndi "kapena") - AND ΠΈ OR, kuphatikiza m'mikhalidwe yovuta, imatsogolera ku mfundo yakuti optimizer, pokhala ndi ma index oyenerera osagwirizana ndi magawo ofunikira, pamapeto pake amayamba kusanthula molingana ndi clustered index (INDEX SCAN) ndi magulu amikhalidwe
Kuyika zisa zakuya za subqueries kumapangitsa kuyika kukhala kovuta kwambiri Mawu a SQL ndi kusanthula dongosolo lamafunso kumbali ya omanga ndi DBA
Apa ndipamene chiwerengero cha chiwerengero cha Status chimayambitsidwa kuti zitsimikizire kuti ziwerengerozi zili patebulo. Chotsatira, chikhalidwe chatsopanochi chikuwonetsedwa.
Ili ndi yankho lofunikira ku vuto la magwiridwe antchito, chifukwa Timapeza data popanda kuwerengera kosafunikira.
3) Kusintha kwa mawonekedwe
Tsoka ilo, mu LINQ mafunso Matebulo osakhalitsa, CTEs, ndi zosintha zamatebulo sizingagwiritsidwe ntchito mwachindunji.
Komabe, pali njira ina yokwaniritsira nkhaniyi - mawonedwe a indexed.
Gulu la zinthu (kuchokera ku chitsanzo pamwambapa) IsClosed = 0 NDIPO Yaletsedwa = 0 NDIPO Yathandizidwa = 0 (kapena seti ya mikhalidwe ina yofananira) imakhala njira yabwino yoti mugwiritse ntchito poyang'ana indexed, kusungitsa kagawo kakang'ono ka data kuchokera pagulu lalikulu.
Ndikofunikira kukumbukira kuti phindu lenileni la kugwiritsira ntchito kawonedwe ka indexed likhoza kupezedwa mwa kulondoleradi.
Koma poyimba mawonedwe, ma index awa sangagwiritsidwe ntchito, ndipo kuti muwagwiritse ntchito momveka bwino, muyenera kufotokoza NDI(NOEXPAND).
Kuyambira mu LINQ mafunso Ndikosatheka kufotokozera malingaliro a tebulo, chifukwa chake muyenera kupanga choyimira china - "wrapper" ya mawonekedwe otsatirawa:
CREATE VIEW ΠΠΠ―_ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);
4) Kugwiritsa ntchito tebulo
Nthawi zambiri mu LINQ mafunso Mipiringidzo ikuluikulu ya ma subqueries kapena midadada yogwiritsa ntchito mawonedwe okhala ndi mawonekedwe ovuta kwambiri imapanga funso lomaliza lomwe lili ndi mawonekedwe ovuta kwambiri komanso ocheperako.
Ubwino Waikulu Wogwiritsa Ntchito Table Functions mu LINQ mafunso:
Kutha, monga momwe zilili ndi mawonedwe, kugwiritsidwa ntchito ndikufotokozedwa ngati chinthu, koma mutha kudutsa magawo angapo olowera: KUCHOKERA KU FUNCTION(@param1, @param2 ...)
Zotsatira zake, sampuli zosinthika za data zitha kukwaniritsidwa
Malangizo patebulo:
ΡΠ΅ΡΠ΅Π· Zamgululi Simungatchule kuti ndi ma index ati omwe akuyenera kugwiritsidwa ntchito ndikuzindikira mulingo wolekanitsa deta mukamafunsa.
Koma ntchitoyi ili ndi mphamvu izi.
Ndi ntchitoyi, mutha kukwaniritsa dongosolo lamafunso nthawi zonse, pomwe malamulo ogwirira ntchito ndi ma index ndi magawo azipatula amatanthauziridwa.
Kugwiritsa ntchito ntchitoyi kumalola, poyerekeza ndi ma indexed, kupeza:
logic yovuta ya zitsanzo (ngakhale kugwiritsa ntchito malupu)
kutengera deta kuchokera kumatebulo osiyanasiyana
ntchito UNION ΠΈ ALIPO
Zopereka KUCHITA zothandiza kwambiri pamene tikufuna kupereka concurrency control ZOCHITA(MAXDOP N), dongosolo la dongosolo la mafunso. Mwachitsanzo:
Pali pempho SANKHANI, yomwe imaphatikiza matebulo angapo ndikugwiritsa ntchito mawonekedwe amodzi (OperativeQuestions), momwe kuyanjana kumafufuzidwa ndi imelo (kudzera ALIPO) mpaka "Mafunso Othandizira":
Pempho nambala 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])
));
Mawonekedwewa ali ndi mawonekedwe ovuta: ali ndi ma subquery amalumikizana ndikugwiritsa ntchito kusanja DISTINCT, yomwe nthawi zambiri imakhala yogwiritsa ntchito zinthu zambiri.
Chitsanzo chochokera ku OperativeQuestions chili pafupi ndi zolemba zikwi khumi.
Vuto lalikulu ndi funsoli ndilakuti pazolemba zochokera ku funso lakunja, gawo lamkati limayikidwa pa [OperativeQuestions] view, zomwe ziyenera kwa [Email] = @p__linq__0 kutilola kuti tichepetse kusankha (kudzera ALIPO) mpaka mazana a zolemba.
Ndipo zitha kuwoneka kuti gawo locheperako liyenera kuwerengera zolembazo kamodzi ndi [Imelo] = @p__linq__0, kenako ma rekodi mazana angapo akuyenera kulumikizidwa ndi Id ndi Mafunso, ndipo funso lidzakhala lachangu.
M'malo mwake, pali kulumikizana motsatizana pamagome onse: kuyang'ana makalata a Id Mafunso ndi Id kuchokera ku OperativeQuestions, ndikusefa ndi Imelo.
M'malo mwake, pempholi limagwira ntchito ndi makumi masauzande a zolemba za OperativeQuestions, koma ndizomwe zimafunikira chidwi kudzera pa Imelo.
OperativeQuestions onani mawu:
Pempho nambala 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));
Kujambula koyamba mu 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");
}
}
Ngakhale ili ndi yankho labwino, pali njira ina yokwaniritsira vutoli.
Cholinga chachikulu ndikusunga zolembedwa ndi [Imelo] = @p__linq__0 kuchokera pakuwona kwa OperativeQuestions.
Tsegulani ntchito ya tebulo [dbo].[OperativeQuestionsUserMail] munkhokwe.
Potumiza Imelo ngati gawo lolowera, timapezanso mndandanda wamakhalidwe:
Pempho nambala 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
Izi zimabweretsanso tebulo lamtengo wapatali lomwe lili ndi deta yofotokozedweratu.
Kuti mafunso ku OperativeQuestionsUserMail akhale oyenera komanso kukhala ndi malingaliro oyenera amafunso, dongosolo lokhazikika limafunikira, osati KUBWERETSA TABLE MONGA KUBWERERA...
(@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]);
Kupanga mapu ndi ntchito mu 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})");
}