Nā ala no ka hoʻonui ʻana i nā nīnau LINQ ma C#.NET
Hōʻike
В kēiaʻatikala ua noʻonoʻo ʻia kekahi mau ʻano hoʻolālā Nā nīnau LINQ.
Eia kekahi, hōʻike mākou i kekahi mau ala e pili ana i ka code optimization e pili ana Nā nīnau LINQ.
Uaʻikeʻia LINQ(Language-Integrated Query) he ʻōlelo maʻalahi a maʻalahi no ka nīnau ʻana i kahi kumu ʻikepili.
А LINQ i SQL he ʻenehana no ka loaʻa ʻana o ka ʻikepili ma kahi DBMS. He mea hana ikaika kēia no ka hana ʻana me ka ʻikepili, kahi i kūkulu ʻia ai nā nīnau ma o ka ʻōlelo hoʻolaha, a laila e hoʻololi ʻia i loko Nā nīnau SQL kahua a hoʻouna ʻia i ke kikowaena waihona no ka hoʻokō. I kā mākou hihia, e DBMS mākou e ʻōlelo nei Pūnaewele MS SQL.
Eia naʻe, Nā nīnau LINQ ʻaʻole i hoʻololi ʻia i mea kākau maikaʻi loa Nā nīnau SQL, hiki i kahi DBA akamai ke kākau me nā nuances a pau o ka optimization Nā nīnau SQL:
nā pilina maikaʻi loa (hui) a me ka kānana ʻana i nā hopena (kahi)
nui nā nuances i ka hoʻohana ʻana i nā pilina a me nā kūlana hui
nui nā ʻano like ʻole i ka hoʻololi ʻana i nā kūlana IN maluna o OLELO HOOLAHAи AOLE IN, <> ma OLELO HOOLAHA
ka hoʻopaʻa ʻana i waena o nā hualoaʻa ma o nā pākaukau pōkole, CTE, nā ʻano hoʻololi papa
ka hoʻohana ʻana i ka ʻōlelo (ʻO OPTION) me nā ʻōlelo aʻo a me nā ʻōlelo hōʻike papa ME (...)
ka hoʻohana ʻana i nā manaʻo i kuhikuhi ʻia ma ke ʻano he mea e hoʻopau ai i ka heluhelu ʻana i ka ʻikepili i ka wā e koho ai
ʻO nā bottlenecks hana nui o ka hopena Nā nīnau SQL i ka houluulu ana Nā nīnau LINQ i:
ka hoʻohui ʻana o ka mīkini koho ʻikepili holoʻokoʻa i hoʻokahi noi
ka hoʻopāpā ʻana i nā poloka like ʻole o ke code, kahi e alakaʻi ai i nā heluhelu ʻikepili pono ʻole
nā pūʻulu o nā kūlana multi-component (logical "a" a me "aiʻole") - AND и OR, hui pū ʻana i nā kūlana paʻakikī, alakaʻi i ka ʻoiaʻiʻo o ka optimizer, me ka loaʻa ʻana o nā indexes non-clustered kūpono no nā māla e pono ai, hoʻomaka i ka nānā ʻana i ka index clustered (NUI INDEX) e nā hui o nā kūlana
ʻO ka nesting hohonu o nā subqueries he pilikia loa ka parsing Nā ʻōlelo SQL a me ka nānā 'ana i ka ho'olālā nīnau ma ka 'ao'ao o nā mea ho'omohala a DBA
Nā ʻano hana hoʻoponopono
I kēia manawa, e neʻe pololei kākou i nā ʻano hoʻolālā.
1) Ka helu helu hou
ʻOi aku ka maikaʻi e noʻonoʻo i nā kānana ma nā papa koho nui, no ka mea, ua kūkulu pinepine ʻia ka nīnau holoʻokoʻa a puni hoʻokahi a ʻelua paha papa nui (nā noi-people-operations) a me kahi kūlana maʻamau (IsClosed, Canceled, Enabled, Status). He mea nui ka hana ʻana i nā hōʻailona kūpono no nā laʻana i ʻike ʻia.
Maikaʻi kēia hoʻonā i ka wā e koho ai i kēia mau kahua e kaupalena nui i ka hoʻonohonoho i hoʻihoʻi ʻia i ka nīnau.
No ka laʻana, loaʻa iā mākou 500000 mau noi. Eia naʻe, aia wale nō 2000 mau noi hana. A laila e hoʻopakele iā mākou i kahi kuhikuhi i koho pono ʻia NUI INDEX ma ka papaʻaina nui a e ʻae iā ʻoe e koho wikiwiki i ka ʻikepili ma o kahi index non-clustered.
Eia kekahi, hiki ke ʻike ʻia ka nele o nā kuhikuhi ma o nā ʻōkuhi no ka hoʻopaʻa ʻana i nā hoʻolālā nīnau a i ʻole ka hōʻiliʻili ʻana i nā helu ʻike ʻōnaehana. Pūnaewele MS SQL:
Loaʻa i nā ʻikepili ʻike a pau ka ʻike e pili ana i nā kuhikuhina i nalowale, koe naʻe nā kuhikuhi kikoʻī.
Eia nō naʻe, ʻo nā indexes a me ka caching ke ʻano o ka hakakā ʻana i nā hopena o ka kākau maikaʻi ʻole Nā nīnau LINQ и Nā nīnau SQL.
E like me ka hana koʻikoʻi o ke ola e hōʻike nei, he mea nui i ka ʻoihana ke hoʻokō i nā hiʻohiʻona ʻoihana e kekahi mau lā palena. A no laila, hoʻololi pinepine ʻia nā noi koʻikoʻi i ke kua me ka caching.
Hoʻoholo ʻia kēia, ʻoiai ʻaʻole pono ka mea hoʻohana i ka ʻikepili hou loa a aia kahi pae kūpono o ka pane ʻana o ka mea hoʻohana.
Hāʻawi kēia ala i ka hoʻoponopono ʻana i nā pono ʻoihana, akā i ka hopena e hōʻemi i ka hana o ka ʻōnaehana ʻike ma ka hoʻopaneʻe wale ʻana i nā hopena i nā pilikia.
He mea pono hoʻi e hoʻomanaʻo i ka ʻimi ʻana i nā indexes pono e hoʻohui, nā manaʻo MS SQL ʻaʻole pololei paha ka hoʻonui ʻana, me ka hoʻopili ʻana ma lalo o kēia mau kūlana:
inā loaʻa nā indexes me kahi pūʻulu o nā kahua like
inā ʻaʻole hiki ke kuhikuhi ʻia nā māla i ka papaʻaina ma muli o ke kaohi ʻana i ka kuhikuhi ʻana (i wehewehe ʻia i nā kikoʻī hou aku maanei).
2) Hoʻohui i nā ʻano i hoʻokahi ʻano hou
I kekahi manawa, hiki ke hoʻololi ʻia kekahi mau māla mai ka papa hoʻokahi, kahi kumu no kahi hui o nā kūlana, ma ka hoʻokomo ʻana i kahi kahua hou.
He ʻoiaʻiʻo loa kēia no nā kahua kūlana, ʻo ia ka mea maʻamau a i ʻole he ʻano ʻano bit a integer paha.
Pākuhi:
Hoʻopaʻa ʻia = 0 A Hoʻopau ʻia = 0 A Hoʻā ʻia = 0 ua paniia e Kūlana = 1.
ʻO kēia kahi i hoʻokomo ʻia ai ke ʻano integer Status e hōʻoia i ka hoʻopiha ʻia ʻana o kēia mau statuses i ka papaʻaina. A laila, kuhikuhi ʻia kēia ʻano hou.
He hopena koʻikoʻi kēia i ka pilikia o ka hana, no ka mea, ʻike mākou i ka ʻikepili me ka ʻole o ka helu pono ʻole.
3) Materialization o ka ike
ʻO ka mea pōʻino, ma Nā nīnau LINQ ʻAʻole hiki ke hoʻohana pololei ʻia nā pākaukau manawa, nā CTE, a me nā mea hoʻololi papa.
Eia nō naʻe, aia kekahi ala ʻē aʻe e hoʻomaikaʻi ai i kēia hihia - nā ʻike kuhikuhi.
Pūʻulu kūlana (mai ka laʻana ma luna) Hoʻopaʻa ʻia = 0 A Hoʻopau ʻia = 0 A Hoʻā ʻia = 0 (a i ʻole he pūʻulu o nā kūlana like ʻē aʻe) lilo i koho maikaʻi e hoʻohana iā lākou i kahi ʻike kuhikuhi, e hoʻopaʻa i kahi ʻāpana liʻiliʻi o ka ʻikepili mai kahi pūʻulu nui.
Akā aia kekahi mau palena i ka wā e hoʻokō ai i kahi ʻike:
me ka hoʻohana ʻana i nā subqueries, clauses OLELO HOOLAHA pono e pani ia ma ka hoohana ana hui
ʻaʻole hiki iā ʻoe ke hoʻohana i nā huaʻōlelo UNION, UNION A PAU, KOE, NANEA
ʻAʻole hiki iā ʻoe ke hoʻohana i nā ʻōlelo aʻoaʻo a me nā paukū ʻO OPTION
ʻaʻole hiki ke hana me nā pōʻai
ʻAʻole hiki ke hōʻike i ka ʻikepili i ka nānā hoʻokahi mai nā papa like ʻole
He mea nui e hoʻomanaʻo ʻo ka pōmaikaʻi maoli o ka hoʻohana ʻana i kahi hiʻohiʻona i kuhikuhi ʻia e hiki ke hoʻokō wale ʻia ma ka kuhikuhi ʻana iā ia.
Akā i ke kāhea ʻana i kahi nānā, ʻaʻole hiki ke hoʻohana ʻia kēia mau kuhikuhi, a no ka hoʻohana pono ʻana iā lākou, pono ʻoe e kuhikuhi ME (NOEXPAND).
Mai loko mai Nā nīnau LINQ ʻAʻole hiki ke wehewehe i nā hōʻailona papa, no laila pono ʻoe e hana i kahi hōʻike hou - he "wrapper" o kēia ʻano:
CREATE VIEW ИМЯ_представления AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);
4) Ke hoʻohana nei i nā hana papaʻaina
I ka manawa pinepine Nā nīnau LINQ ʻO nā poloka nui o nā subqueries a i ʻole nā poloka e hoʻohana ana i nā hiʻohiʻona me kahi hoʻolālā paʻakikī e hana i kahi nīnau hope me kahi ʻano hoʻokō paʻakikī a suboptimal.
Nā Pōmaikaʻi Nui o ka hoʻohana ʻana i nā hana papa ma Nā nīnau LINQ:
ʻO ka hiki, e like me ke ʻano o nā manaʻo, e hoʻohana ʻia a kuhikuhi ʻia ma ke ʻano he mea, akā hiki iā ʻoe ke hāʻawi i kahi hoʻonohonoho o nā ʻāpana hoʻokomo: MAI KA HANA(@param1, @param2 ...)
ʻO ka hopena, hiki ke hoʻokō ʻia ka laʻana ʻikepili maʻalahi
I ka hihia o ka hoʻohana ʻana i kahi hana papaʻaina, ʻaʻohe palena ikaika e like me ke ʻano o nā manaʻo kuhikuhi i hōʻike ʻia ma luna.
Nā ʻōlelo aʻoaʻo papa:
через LINQ ʻAʻole hiki iā ʻoe ke kuhikuhi i nā ʻōlelo kuhikuhi e hoʻohana ʻia a hoʻoholo i ka pae kaʻawale ʻikepili i ka wā e nīnau ai.
Akā aia kēia mau mana i ka hana.
Me ka hana, hiki iā ʻoe ke hoʻokō i kahi hoʻolālā noiʻi hoʻokō mau, kahi i wehewehe ʻia ai nā lula no ka hana ʻana me nā indexes a me nā pae kaʻawale ʻikepili.
ʻO ka hoʻohana ʻana i ka hana e hiki ai, ke hoʻohālikelike ʻia me nā manaʻo i kuhikuhi ʻia, e loaʻa:
ʻO ka loina sampling data paʻakikī (me ka hoʻohana ʻana i nā puka lou)
kiʻi ʻikepili mai nā papa ʻokoʻa he nui
i ka hoʻohana 'ana o UNION и OLELO HOOLAHA
Hāʻawi ʻO OPTION pono loa inā pono mākou e hāʻawi i ka mana concurrency KOHO (MAXDOP N), ka hoʻonohonoho o ka hoʻolālā hoʻokō nīnau. ʻo kahi laʻana:
hiki iā ʻoe ke kuhikuhi i ka hana hou ʻana o ka hoʻolālā nīnau KOHO (RECOMPILE)
hiki iā ʻoe ke kuhikuhi inā e koi ʻia ka hoʻolālā nīnau e hoʻohana i ke kauoha hui i kuhikuhi ʻia i ka nīnau KOHO (FORCE ORDER)
Nā kikoʻī hou aku e pili ana ʻO OPTION wehewehe ʻia maanei.
Ke hoʻohana nei i ka ʻāpana ʻikepili haiki a koi loa:
ʻAʻohe pono e mālama i nā pūʻulu ʻikepili nui i loko o nā caches (e like me ke ʻano me nā manaʻo i kuhikuhi ʻia), kahi e pono ai ʻoe e kānana i ka ʻikepili ma ke ʻano.
Eia kekahi laʻana, aia kahi papaʻaina nona kāna kānana kahi ʻekolu mau kahua i hoʻohana ʻia (a, b, c).
Ma keʻano maʻamau, he kūlana mau nā nīnau a pau a = 0 a me b = 0.
Eia naʻe, ke noi no ke kahua c hoololi hou aku.
E ʻae ke kūlana a = 0 a me b = 0 He mea kōkua maoli iā mākou e kaupalena i ka hopena i makemake ʻia i hoʻonohonoho ʻia i nā kaukani o nā moʻolelo, akā ʻo ke kūlana с hōʻemi i ke koho ʻana i hoʻokahi haneli moʻolelo.
Maanei paha he koho maikaʻi loa ka hana papaʻaina.
Eia kekahi, ʻoi aku ka wānana a paʻa i ka hana papaʻaina i ka manawa hoʻokō.
examples
E nānā kākou i ka hoʻokō laʻana me ka hoʻohana ʻana i ka waihona Nīnau ma ke ʻano he laʻana.
Aia kahi noi koho i, ka mea e hoʻohui i kekahi mau papa a hoʻohana i hoʻokahi nānā (OperativeQuestions), kahi e nānā ʻia ai ka pilina ma ka leka uila (ma o OLELO HOOLAHA) i “Nīnau Operative”:
Noi 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])
));
He ʻano paʻakikī ka ʻike: loaʻa iā ia nā subquery hui a hoʻohana i ka hoʻokaʻawale Hoʻoponopono, ka mea ma ka laulā he hana pono waiwai.
ʻO kahi laʻana mai OperativeQuestions ma kahi o ʻumi tausani mau moʻolelo.
ʻO ka pilikia nui me kēia nīnau, ʻo ia no nā moʻolelo mai ka nīnau waho, ua hoʻokō ʻia kahi subquery kūloko ma ka ʻike [OperativeQuestions]. OLELO HOOLAHA) a hiki i nā haneli mau moʻolelo.
A me he mea lā e helu ka subquery i nā moʻolelo i hoʻokahi manawa e [Email] = @p__linq__0, a laila e hoʻopili ʻia kēia mau haneli mau moʻolelo e Id me nā nīnau, a wikiwiki ka nīnau.
ʻOiaʻiʻo, aia kahi pilina pili o nā papa a pau: nānā i ka pili o nā nīnau Id me Id mai OperativeQuestions, a me ke kānana ʻana ma ka leka uila.
ʻOiaʻiʻo, hana ka noi me nā ʻumi tausani o nā moʻolelo OperativeQuestions, akā pono wale ka ʻikepili o ka hoihoi ma o ka leka uila.
Nānā i nā kikokikona OperativeNīnau:
Noi 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));
Palapala 'ike mua ma 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");
}
}
I kēia hihia kūikawā, ke noʻonoʻo nei mākou i kahi hoʻonā i kēia pilikia me ka ʻole o ka hoʻololi ʻana i ka ʻenehana, me ka ʻole o ka hoʻokomo ʻana i kahi papaʻaina ʻokoʻa me nā hopena i hoʻomākaukau ʻia ("Nīnau Hana"), kahi e koi ai i kahi mīkini no ka hoʻopiha ʻana me ka ʻikepili a mālama ʻia i kēia lā .
ʻOiai he hopena maikaʻi kēia, aia kekahi koho ʻē aʻe e hoʻoponopono i kēia pilikia.
ʻO ke kumu nui, ʻo ia ka hoʻopaʻa ʻana i nā mea hoʻokomo e [Email] = @p__linq__0 mai ka ʻike OperativeQuestions.
E hoʻokomo i ka hana papaʻaina [dbo].[OperativeQuestionsUserMail] i loko o ka waihona.
Ma ka hoʻouna ʻana i ka leka uila ma ke ʻano he helu hoʻokomo, loaʻa iā mākou kahi papa o nā waiwai:
Noi 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
Hoʻihoʻi kēia i kahi papa o nā waiwai me kahi hoʻolālā data i koho mua ʻia.
I mea e ʻoi aku ka maikaʻi o nā nīnau iā OperativeQuestionsUserMail a loaʻa i nā hoʻolālā noiʻi maikaʻi loa, pono ke ʻano koʻikoʻi, ʻaʻole HO'I PAPA IA HO'I...
I kēia hihia, ua hoʻololi ʻia ka nīnau noiʻi 1 i ka nīnau 4:
Noi 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]);
Ka palapala ʻāina i nā manaʻo a me nā hana ma 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})");
}
Ua hāʻule ke kauoha o ka manawa hoʻokō mai 200-800 ms, i 2-20 ms, etc., ʻo ia hoʻi he ʻumi mau manawa wikiwiki.
Inā mākou e lawe i ka awelika, a laila ma kahi o 350 ms ua loaʻa iā mākou he 8 ms.
Mai nā pōmaikaʻi maopopo loa e loaʻa iā mākou:
hoemi nui i ka haawe heluhelu,
ka ho'ēmi nui i ka likelihood o ka ālai
e hoemi ana i ka awelika manawa pa'a i na waiwai kupono
hopena
ʻO ka hoʻonui a me ka hoʻoponopono maikaʻi ʻana i nā kelepona ʻikepili MS SQL через LINQ he pilikia hiki ke hoʻoponopono ʻia.
He mea koʻikoʻi ka noʻonoʻo a me ka paʻa i kēia hana.
I ka hoʻomaka ʻana o ke kaʻina hana:
pono e nānā i ka ʻikepili kahi e hana ai ka noi (nā waiwai, nā ʻano ʻikepili i koho ʻia)
e hoʻokō pono i ka kuhikuhi ʻana i kēia ʻikepili
e nānā i ka pololei o ka hoʻohui ʻana ma waena o nā papa
Hōʻike ʻia ka ʻike hoʻoponopono hou aʻe:
kumu o ka noi a wehewehe i ka kānana noi nui
ka hana hou ʻana i nā poloka nīnau like a me ka nānā ʻana i ka hui ʻana o nā kūlana
ma SSMS a i ʻole GUI ʻē aʻe no Pūnaehana SQL optimizes ia iho Nīnau SQL (ka hoʻokaʻawale ʻana i kahi waihona ʻikepili waena, kūkulu i ka hopena hulina me ka hoʻohana ʻana i kēia waihona (he nui paha))
i ka pae hope, e lawe ana i kumu i ka hopena Nīnau SQL, ke kūkulu hou ʻia nei ka hale Nīnau LINQ
ʻO ka hopena Nīnau LINQ pono e like ke ano me ka mea maikai i ikeia Nīnau SQL mai ka helu 3.
Mahalo
Mahalo nui i nā hoa hana hana и alex_ozr mai ka hui ʻO Fortis no ke kokua ana i ka hoomakaukau ana i keia mea.