Dòighean airson ceistean LINQ a mheudachadh ann an C#.NET

Ro-ràdh

В an artaigil seo chaidh beachdachadh air cuid de dhòighean optimization Ceistean LINQ.
An seo tha sinn cuideachd a’ taisbeanadh cuid a bharrachd dhòighean-obrach airson optimization còd co-cheangailte ri Ceistean LINQ.

Tha fios againn sin LINQ'S e cànan sìmplidh agus goireasach a th' ann an (Ceasnachadh Cànain-Amalaichte) airson a bhith a' ceasnachadh stòr dàta.

А LINQ gu SQL na theicneòlas airson faighinn gu dàta ann an DBMS. Is e inneal cumhachdach a tha seo airson obrachadh le dàta, far a bheil ceistean air an togail tro chànan dearbhaidh, a thèid an uairsin atharrachadh gu Ceistean SQL àrd-ùrlar agus air a chuir gu frithealaiche an stòr-dàta airson a chuir gu bàs. Anns a 'chùis againn, le DBMS tha sinn a' ciallachadh Frithealaiche MS SQL.

Ach, Ceistean LINQ nach eil air an tionndadh gu bhith sgrìobhte as fheàrr Ceistean SQL, a dh’ fhaodadh DBA eòlach a sgrìobhadh leis a h-uile nuance de optimization Ceistean SQL:

  1. na ceanglaichean as fheàrr (Co-aoinn) agus a’ sìoladh nan toraidhean (FAR)
  2. mòran nuances ann a bhith a’ cleachdadh cheanglaichean agus suidheachaidhean buidhne
  3. mòran atharrachaidhean ann an suidheachaidhean ath-chuiridh IN air EILEANACHи NACH ANN, <> air adhart EILEANACH
  4. tasgadh eadar-mheadhanach de thoraidhean tro chlàran sealach, CTE, caochladairean bùird
  5. cleachdadh na seantans (RIAGHLADH) le stiùireadh agus molaidhean bùird LEIS (...)
  6. a’ cleachdadh seallaidhean clàr-amais mar aon de na dòighean air faighinn cuidhteas leughaidhean dàta gun fheum aig àm taghadh

Na prìomh bhotail coileanaidh den toradh Ceistean SQL nuair a thathar a' cur ri chèile Ceistean LINQ tha:

  1. daingneachadh an uidheamachd taghaidh dàta gu lèir ann an aon iarrtas
  2. a’ dùblachadh blocaichean còd co-ionann, a bhios aig a’ cheann thall a’ leantainn gu iomadh leughadh dàta neo-riatanach
  3. buidhnean de shuidheachaidhean ioma-phàirteach (loidsigeach “agus” agus “no”) - AGUS и OR, a 'tighinn còmhla ann an suidheachaidhean iom-fhillte, a' ciallachadh gu bheil an optimizer, le clàran-amais neo-chnuasach freagarrach airson na raointean riatanach, mu dheireadh a 'tòiseachadh a' sganadh an aghaidh a 'chlàr-amais cruinnichte (SCAN INDEX) le buidhnean de shuidheachaidhean
  4. tha neadachadh domhainn de subqueries a’ fàgail parsadh gu math duilich Aithrisean SQL agus mion-sgrùdadh air a’ phlana ceist bho luchd-leasachaidh agus DBA

Modhan optimachaidh

A-nis gluaisidh sinn gu dìreach gu dòighean optimization.

1) Clàr-innse a bharrachd

Tha e nas fheàrr beachdachadh air sìoltachain air na prìomh chlàran taghaidh, oir glè thric bidh a’ cheist gu lèir air a thogail timcheall air aon no dhà de phrìomh chlàran (tagraidhean-obrach-daoine) agus le seata àbhaisteach de chumhachan (IsClosed, Cur dheth, Comasach, Inbhe). Tha e cudromach clàran-amais iomchaidh a chruthachadh airson na sampallan ainmichte.

Tha am fuasgladh seo a’ dèanamh ciall nuair a tha thu a’ taghadh nan raointean sin gu mòr a’ cuingealachadh an t-seata a chaidh a thilleadh chun cheist.

Mar eisimpleir, tha 500000 tagradh againn. Ach, chan eil ann ach 2000 tagradh gnìomhach. An uairsin sàbhalaidh clàr-amais a tha air a thaghadh gu ceart sinn bho SCAN INDEX air clàr mòr agus leigidh e leat dàta a thaghadh gu sgiobalta tro chlàr-amais neo-chnuasach.

Cuideachd, faodar gainnead chlàran-amais aithneachadh tro bhrosnachadh airson planaichean ceist a pharsadh no staitistig sealladh siostam a chruinneachadh Frithealaiche MS SQL:

  1. sys.dm_db_missing_index_groups
  2. sys.dm_db_missing_index_group_stats
  3. sys.dm_db_missing_index_details

Anns a h-uile dàta seallaidh tha fiosrachadh mu chlàran-amais a tha a dhìth, ach a-mhàin clàran-amais spàsail.

Ach, gu tric bidh clàran-amais agus tasgadan mar dhòighean air cuir an-aghaidh buaidh droch sgrìobhadh Ceistean LINQ и Ceistean SQL.

Mar a tha cleachdadh cruaidh na beatha a’ nochdadh, gu tric tha e cudromach do ghnìomhachas feartan gnìomhachais a chuir an gnìomh ro chinn-ama sònraichte. Agus mar sin, bidh iarrtasan trom gu tric air an gluasad chun chùl le tasgadh.

Tha seo gu ìre air fhìreanachadh, leis nach eil feum aig an neach-cleachdaidh an-còmhnaidh air an dàta as ùire agus gu bheil ìre iomchaidh de fhreagarrachd aig an eadar-aghaidh cleachdaiche.

Tha an dòigh-obrach seo a 'ceadachadh fuasgladh fhaighinn air feumalachdan gnìomhachais, ach aig a' cheann thall a 'lùghdachadh coileanadh an t-siostam fiosrachaidh le bhith dìreach a' cur dàil air fuasglaidhean air duilgheadasan.

'S fhiach cuimhneachadh gu bheil anns a' phròiseas a 'coimhead airson na clàran-amais riatanach a chur ris, molaidhean MS SQL Faodaidh optimization a bhith ceàrr, a’ toirt a-steach fo na cumhaichean a leanas:

  1. ma tha clàran-amais ann mu thràth le seata raointean coltach ris
  2. mura h-urrainnear na raointean sa chlàr a chlàradh mar thoradh air cuingealachaidhean clàr-amais (air am mìneachadh nas mionaidiche an seo).

2) Ag aonachadh buadhan gu aon fheart ùr

Uaireannan faodaidh cuid de raointean bho aon bhòrd, a tha mar bhunait airson buidheann de shuidheachaidhean, a bhith air an cur an àite aon raon ùr.

Tha seo gu h-àraidh fìor airson raointean inbhe, a tha mar as trice an dàrna cuid beagan no ann an sreath.

Eisimpleir:

IsClosed = 0 AND Air a chur dheth = 0 AND Comasach = 0 air a chur na àite Inbhe = 1.

Seo far a bheilear a’ toirt a-steach feart Inbhe iomlanachd gus dèanamh cinnteach gu bheil na h-inbhean sin anns a’ chlàr. An ath rud, tha am feart ùr seo air a chlàr-amais.

Is e fuasgladh bunaiteach a tha seo don duilgheadas coileanaidh, leis gu bheil sinn a’ faighinn cothrom air dàta gun àireamhachadh neo-riatanach.

3) Stuthachadh an t-seallaidh

Gu mì-fhortanach, ann an Ceistean LINQ Chan urrainnear clàran sealach, CTEn, agus caochladairean bùird a chleachdadh gu dìreach.

Ach, tha dòigh eile ann airson an fheum as fheàrr a dhèanamh airson a’ chùis seo - beachdan clàr-amais.

Buidheann staid (bhon eisimpleir gu h-àrd) IsClosed = 0 AND Air a chur dheth = 0 AND Comasach = 0 (no seata de shuidheachaidhean eile coltach ris) gu bhith na dheagh roghainn airson an cleachdadh ann an sealladh clàr-amais, a’ tasgadh sliseag bheag de dhàta bho sheata mhòr.

Ach tha grunn chuingealachaidhean ann nuair a thig thu gu sealladh:

  1. cleachdadh subqueries, clàsan EILEANACH bu chòir a chur an àite le bhith a 'cleachdadh Co-aoinn
  2. chan urrainn dhut seantansan a chleachdadh AONADH, AONAD UILE, FIOSRACHADH, EADAR-MHINEACHADH
  3. Chan urrainn dhut molaidhean bùird agus clàsan a chleachdadh RIAGHLADH
  4. chan eil cothrom ann a bhith ag obair le cearcallan
  5. Tha e do-dhèanta dàta a thaisbeanadh ann an aon sealladh bho chlàran eadar-dhealaichte

Tha e cudromach cuimhneachadh nach urrainnear am fìor bhuannachd bho bhith a’ cleachdadh sealladh clàr-amais a choileanadh ach le bhith ga chlàradh.

Ach nuair a bhios tu a’ gairm sealladh, chan fhaod na clàran-amais sin a bhith air an cleachdadh, agus airson an cleachdadh gu soilleir, feumaidh tu sònrachadh LE (NOEXPAND).

Bhon a-staigh Ceistean LINQ Tha e do-dhèanta molaidhean bùird a mhìneachadh, agus mar sin feumaidh tu riochdachadh eile a chruthachadh - “còmhdaiche” den fhoirm a leanas:

CREATE VIEW ИМЯ_представления AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);

4) A 'cleachdadh gnìomhan bùird

Gu tric ann an Ceistean LINQ Bidh blocaichean mòra de fho-cheistean no blocaichean a’ cleachdadh seallaidhean le structar iom-fhillte a’ cruthachadh ceist dheireannach le structar buileachaidh gu math toinnte agus suboptimal.

Prìomh bhuannachdan bho bhith a’ cleachdadh gnìomhan bùird ann an Ceistean LINQ:

  1. An comas, mar ann an cùis seallaidhean, a bhith air a chleachdadh agus air a shònrachadh mar nì, ach faodaidh tu a dhol seachad air seata de pharaimearan cuir a-steach:
    BHO FEUMALACHD (@param1, @param2 ...)
    Mar thoradh air an sin, faodar samplachadh dàta sùbailte a choileanadh
  2. A thaobh a bhith a’ cleachdadh gnìomh bùird, chan eil bacadh cho làidir ann a thaobh seallaidhean clàr-amais a tha air am mìneachadh gu h-àrd:
    1. Molaidhean clàr:
      через LINQ Chan urrainn dhut dè na clàran-amais a bu chòir a chleachdadh a shònrachadh agus an ìre iomallachd dàta a dhearbhadh nuair a bhios tu a’ faighneachd.
      Ach tha na comasan sin aig a’ ghnìomh.
      Leis a’ ghnìomh, faodaidh tu plana ceist cur an gnìomh gu math seasmhach a choileanadh, far a bheil riaghailtean airson obrachadh le clàran-amais agus ìrean aonaranachd dàta air am mìneachadh
    2. Le bhith a’ cleachdadh a’ ghnìomh leigidh sin, an coimeas ri beachdan clàr-amais, na leanas fhaighinn:
      • loidsig samplachadh dàta iom-fhillte (eadhon a’ cleachdadh lùban)
      • a’ faighinn dàta bho iomadh clàr eadar-dhealaichte
      • cleachdadh na AONADH и EILEANACH

  3. Tairgsean RIAGHLADH glè fheumail nuair a dh'fheumas sinn smachd concurrency a thoirt seachad ROGHA(MAXDOP N), òrdugh plana gnìomh na ceiste. Mar eisimpleir:
    • faodaidh tu ath-chruthachadh èiginneach de phlana na ceiste a shònrachadh ROGHAINN (RECOMPILE)
    • faodaidh tu sònrachadh am bu chòir dhut plana na ceiste a sparradh gus an òrdugh ceangail a chaidh a shònrachadh sa cheist a chleachdadh ROGHAINN (ORDER FEUMAL)

    Tuilleadh fiosrachaidh mu dheidhinn RIAGHLADH air a mhìneachadh an seo.

  4. A’ cleachdadh an t-sliseag dàta as cumhainge agus as fheumaile:
    Chan eil feum air seataichean dàta mòra a stòradh ann an caches (mar a tha fìor le seallaidhean clàr-amais), às am feum thu fhathast an dàta a shìoladh le paramadair.
    Mar eisimpleir, tha clàr ann leis a’ chriathrag FAR tha trì raointean gan cleachdadh (a, b, c).

    Gu gnàthach, tha suidheachadh seasmhach aig a h-uile iarrtas a = 0 agus b = 0.

    Ach, an t-iarrtas airson an achadh c nas caochlaideach.

    Leig leis an t-suidheachadh a = 0 agus b = 0 Tha e gu mòr gar cuideachadh gus an seata toraidh a tha a dhìth a chuingealachadh gu mìltean de chlàran, ach tha an suidheachadh air adhart с a’ lùghdachadh an taghadh sìos gu ceud clàr.

    An seo is dòcha gum bi gnìomh a’ bhùird na roghainn nas fheàrr.

    Cuideachd, tha gnìomh bùird nas seasmhaiche agus nas cunbhalaiche ann an ùine cur gu bàs.

eisimpleirean

Bheir sinn sùil air eisimpleir de bhuileachadh a’ cleachdadh stòr-dàta Ceistean mar eisimpleir.

Tha iarrtas ann SELECT, a tha a’ cothlamadh grunn chlàran agus a’ cleachdadh aon sealladh (OperativeQuestions), anns a bheil ceangal air a sgrùdadh le post-d (tro EILEANACH) gu “Ceistean Obrachaidh”:

Iarrtas Àir. 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])
));

Tha structar caran toinnte aig an t-sealladh: tha subquery a’ ceangal agus a’ cleachdadh seòrsachadh GNOTHAICH, a tha san fharsaingeachd na ghnìomhachd a tha gu math dian air stòras.

Tha sampall bho OperativeQuestions timcheall air deich mìle clàr.

'S e am prìomh dhuilgheadas leis a' cheist seo, airson nan clàran bhon iarrtas a-muigh, gu bheil fo-iarrtas a-staigh air a chur an gnìomh air an t-sealladh [OperativeQuestions], a bu chòir airson [Email] = @p__linq__0 leigeil leinn an taghadh toraidh a chuingealachadh (tro EILEANACH) suas ri ceudan de chlàran.

Agus is dòcha gu bheil e coltach gum bu chòir don fho-cheist na clàran obrachadh a-mach aon uair le [Email] = @p__linq__0, agus an uairsin bu chòir an dà cheud clàr seo a bhith ceangailte le Id le Ceistean, agus bidh a’ cheist luath.

Gu dearbh, tha ceangal sreathach anns a h-uile clàr: a’ sgrùdadh conaltradh Ceistean Id le Id bho OperativeQuestions, agus sìoladh tro phost-d.

Gu dearbh, bidh an t-iarrtas ag obair leis na deichean mhìltean de chlàran ObrachaidhQuestions, ach chan eil ach an dàta inntinneach a tha a dhìth tro phost-d.

Ceistean Obrachaidh faic an teacsa:

Iarrtas Àir. 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));

Mapadh sealladh tùsail ann an 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");
    }
}

A’ chiad cheist 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();

Anns a ’chùis shònraichte seo, tha sinn a’ beachdachadh air fuasgladh fhaighinn air an duilgheadas seo gun atharrachaidhean bun-structair, gun a bhith a ’toirt a-steach clàr air leth le toraidhean deiseil (“ Ceistean Gnìomhach ”), a dh’ fheumadh dòigh airson a lìonadh le dàta agus a chumail ùraichte. .

Ged is e fuasgladh math a tha seo, tha roghainn eile ann airson an duilgheadas seo a bharrachadh.

'S e am prìomh adhbhar tasgaichean a chur a-steach le [Email] = @p__linq__0 bhon t-sealladh OperativeQuestions.

Thoir a-steach gnìomh a’ bhùird [dbo].[OperativeQuestionsUserMail] dhan stòr-dàta.

Le bhith a’ cur post-d mar paramadair cuir a-steach, gheibh sinn clàr luachan air ais:

Iarrtas Àir. 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

Bidh seo a 'tilleadh clàr luachan le structar dàta ro-mhìnichte.

Gus am bi ceistean gu OperativeQuestionsUserMail aig an ìre as fheàrr agus gu bheil na planaichean ceist as fheàrr aca, tha feum air structar teann, agus chan eil A' TUILLEADH bhòrd MAR THUR...

Anns a 'chùis seo, tha an Ceist 1 riatanach air a thionndadh gu Ceist 4:

Iarrtas Àir. 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]);

A’ mapadh bheachdan agus gnìomhan ann an 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})");
}

Ceist LINQ mu dheireadh

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();

Tha òrdugh ùine cur gu bàs air tuiteam bho 200-800 ms, gu 2-20 ms, msaa, i.e. deichean de thursan nas luaithe.

Ma ghabhas sinn e nas cuibheasach, an àite 350 ms fhuair sinn 8 ms.

Bho na buannachdan follaiseach a gheibh sinn cuideachd:

  1. lùghdachadh coitcheann ann an luchd leughaidh,
  2. lùghdachadh mòr ann an coltachd bacadh
  3. a’ lughdachadh na h-ùine bacaidh cuibheasach gu luachan iomchaidh

co-dhùnadh

Optimization agus gleusadh fiosan stòr-dàta MS SQL через LINQ tha e na dhuilgheadas a dh'fhaodar a rèiteachadh.

Tha aire agus cunbhalachd glè chudromach san obair seo.

Aig toiseach a 'phròiseis:

  1. feumar sgrùdadh a dhèanamh air an dàta leis a bheil an t-iarrtas ag obair (luachan, seòrsaichean dàta taghte)
  2. dèan clàr-amais ceart den dàta seo
  3. thoir sùil air ceartachd nan suidheachaidhean ceangail eadar bùird

Tha an ath chuairt optimization a’ nochdadh:

  1. bunait an iarrtais agus a’ mìneachadh a’ phrìomh shìoltachain iarrtas
  2. ag ath-aithris blocaichean ceist coltach ris agus a’ dèanamh anailis air an eadar-ghearradh de shuidheachaidhean
  3. ann an SSMS no GUI eile airson Freiceadan SQL ga dhèanamh fhèin nas fheàrr Ceist SQL (a’ riarachadh stòradh dàta eadar-mheadhanach, a’ togail a’ cheist a thig às a’ cleachdadh an stòraidh seo (dh’ fhaodadh grunn a bhith ann))
  4. aig an ìre mu dheireadh, a 'gabhail mar bhunait air an toradh Ceist SQL, tha an structar ga ath-thogail Ceist LINQ

An toradh Ceist LINQ bu chòir a bhith co-ionann ann an structar ris an ìre as fheàrr a chaidh ainmeachadh Ceist SQL bho puing 3.

Buidheachas

Mòran taing do cho-obraichean obraichean и ailig_ozr bhon chompanaidh Fortis airson cuideachadh ann a bhith ag ullachadh an stuth seo.

Source: www.habr.com

Cuir beachd ann