Awọn ọna fun iṣapeye awọn ibeere LINQ ni C #.NET

Ifihan

В Arokọ yi diẹ ninu awọn ọna iṣapeye ni a gbero Awọn ibeere LINQ.
Nibi a tun ṣafihan awọn isunmọ diẹ sii si iṣapeye koodu ti o ni ibatan si Awọn ibeere LINQ.

O mọ pe LINQ(Ibeere Iṣọkan-ede) jẹ ede ti o rọrun ati irọrun fun wiwa orisun data kan.

А LINQ si SQL jẹ imọ-ẹrọ fun iraye si data ni DBMS kan. Eyi jẹ ohun elo ti o lagbara lati ṣiṣẹ pẹlu data, nibiti a ti ṣe agbekalẹ awọn ibeere nipasẹ ede asọye, eyiti yoo yipada si SQL ibeere Syeed ati firanṣẹ si olupin data data fun ipaniyan. Ninu ọran wa, nipasẹ DBMS a tumọ si Olupin MS SQL.

Sibẹsibẹ, Awọn ibeere LINQ ti wa ni ko iyipada sinu optimally kọ eyi SQL ibeere, eyiti DBA ti o ni iriri le kọ pẹlu gbogbo awọn nuances ti iṣapeye SQL ibeere:

  1. awọn asopọ ti o dara julọ (JOIN) ati sisẹ awọn abajade (Nibo)
  2. ọpọlọpọ awọn nuances ni lilo awọn asopọ ati awọn ipo ẹgbẹ
  3. ọpọlọpọ awọn iyatọ ninu awọn ipo ti o rọpo IN on YATOи KO IN, <> lori YATO
  4. caching agbedemeji ti awọn abajade nipasẹ awọn tabili igba diẹ, CTE, awọn oniyipada tabili
  5. lilo gbolohun (Ṣiṣayan) pẹlu awọn itọnisọna ati awọn imọran tabili PẸLU (...)
  6. lilo awọn iwo atọka bi ọkan ninu awọn ọna lati yọkuro awọn kika data laiṣe laiṣe lakoko awọn yiyan

Awọn igo iṣẹ akọkọ ti abajade SQL ibeere nigbati o ba n ṣajọ Awọn ibeere LINQ ni:

  1. isọdọkan ti gbogbo ẹrọ yiyan data ni ibeere kan
  2. pidánpidán aami awọn bulọọki ti koodu, eyi ti o be ja si ọpọ kobojumu data kika
  3. awọn ẹgbẹ ti awọn ipo eroja pupọ (mọgbon “ati” ati “tabi”) - AND и OR, apapọ sinu awọn ipo idiju, o yori si otitọ pe olupilẹṣẹ, nini awọn atọka ti ko ni akopọ ti o yẹ fun awọn aaye pataki, nikẹhin bẹrẹ lati ọlọjẹ lodi si atọka iṣupọ (AWỌN ỌRỌ AWỌN ỌRỌ) nipasẹ awọn ẹgbẹ ti awọn ipo
  4. itẹ-ẹiyẹ ti o jinlẹ ti awọn ibeere ti o jẹ ki atupalẹ jẹ iṣoro pupọ Awọn alaye SQL ati igbekale ibeere eto lori apa ti Difelopa ati dba

Awọn ọna iṣapeye

Bayi jẹ ki a gbe taara si awọn ọna iṣapeye.

1) Atọka afikun

O dara julọ lati gbero awọn asẹ lori awọn tabili yiyan akọkọ, niwọn igba pupọ gbogbo ibeere ni a kọ ni ayika ọkan tabi meji tabili akọkọ (awọn ohun elo-awọn iṣẹ eniyan) ati pẹlu eto awọn ipo boṣewa (IsClosed, Fagilee, Ṣiṣẹ, Ipo). O ṣe pataki lati ṣẹda awọn itọka ti o yẹ fun awọn ayẹwo idanimọ.

Ojutu yii jẹ oye nigba yiyan awọn aaye wọnyi ni pataki ṣe opin eto ti o pada si ibeere naa.

Fun apẹẹrẹ, a ni awọn ohun elo 500000. Sibẹsibẹ, awọn ohun elo 2000 nikan lo wa. Lẹhinna atọka ti a yan ni pipe yoo gba wa lọwọ AWỌN ỌRỌ AWỌN ỌRỌ lori tabili nla kan ati pe yoo gba ọ laaye lati yara yan data nipasẹ atọka ti kii ṣe iṣupọ.

Paapaa, aisi awọn atọka le ṣe idanimọ nipasẹ awọn itara fun awọn ero ibeere ṣiṣayẹwo tabi gbigba awọn iṣiro wiwo eto Olupin MS SQL:

  1. sys.dm_db_missing_index_awọn ẹgbẹ
  2. sys.dm_db_missing_index_group_stats
  3. sys.dm_db_missing_index_details

Gbogbo data wiwo ni alaye nipa awọn atọka ti o padanu, ayafi awọn atọka aaye.

Sibẹsibẹ, awọn atọka ati caching nigbagbogbo jẹ awọn ọna lati koju awọn abajade ti kikọ ti ko dara Awọn ibeere LINQ и SQL ibeere.

Gẹgẹbi iṣe lile ti igbesi aye fihan, o jẹ pataki nigbagbogbo fun iṣowo lati ṣe awọn ẹya iṣowo nipasẹ awọn akoko ipari kan. Ati nitorinaa, awọn ibeere ti o wuwo nigbagbogbo ni gbigbe si abẹlẹ pẹlu caching.

Eyi jẹ idalare ni apakan, nitori olumulo ko nilo data tuntun nigbagbogbo ati pe ipele itẹwọgba ti idahun ti wiwo olumulo wa.

Ọna yii ngbanilaaye lati yanju awọn iwulo iṣowo, ṣugbọn nikẹhin dinku iṣẹ ṣiṣe ti eto alaye nipa ṣiṣe idaduro awọn ojutu si awọn iṣoro.

O tun tọ lati ranti pe ninu ilana wiwa fun awọn atọka pataki lati ṣafikun, awọn imọran MS SQL iṣapeye le jẹ aṣiṣe, pẹlu labẹ awọn ipo wọnyi:

  1. ti o ba ti wa tẹlẹ atọka pẹlu kan iru ṣeto ti oko
  2. ti awọn aaye inu tabili ko ba le ṣe atọka nitori awọn ihamọ atọka (apejuwe ni awọn alaye diẹ sii nibi).

2) Dapọ awọn eroja sinu ẹya tuntun kan

Nigba miiran diẹ ninu awọn aaye lati tabili kan, eyiti o jẹ ipilẹ fun ẹgbẹ awọn ipo, le paarọ rẹ nipasẹ iṣafihan aaye tuntun kan.

Eyi jẹ otitọ paapaa fun awọn aaye ipo, eyiti o jẹ igbagbogbo boya bit tabi odidi ni iru.

Apeere:

IsClosed = 0 AND Fagilee = 0 ATI Ṣiṣẹ = 0 ti wa ni rọpo nipasẹ Ipo = 1.

Eyi ni ibi ti a ti ṣe afihan Ipo odidi lati rii daju pe awọn ipo wọnyi ti wa ninu tabili. Nigbamii ti, abuda tuntun yii jẹ atọka.

Eyi jẹ ojutu ipilẹ si iṣoro iṣẹ, nitori A wọle si data laisi awọn iṣiro ti ko wulo.

3) Ohun elo ti wiwo

Laanu, ninu Awọn ibeere LINQ Awọn tabili igba diẹ, awọn CTE, ati awọn oniyipada tabili ko ṣee lo taara.

Sibẹsibẹ, ọna miiran wa lati mu dara julọ fun ọran yii - awọn wiwo atọka .

Ẹgbẹ ipo (lati apẹẹrẹ loke) IsClosed = 0 AND Fagilee = 0 ATI Ṣiṣẹ = 0 (tabi akojọpọ awọn ipo miiran ti o jọra) di aṣayan ti o dara lati lo wọn ni wiwo itọka, fifipamọ bibẹẹ kekere ti data lati eto nla kan.

Ṣugbọn nọmba awọn ihamọ wa nigba lilo wiwo kan:

  1. lilo awọn ibeere, awọn gbolohun ọrọ YATO yẹ ki o rọpo nipasẹ lilo JOIN
  2. o ko le lo awọn gbolohun ọrọ UNION, GBOGBO GBOGBO, YATO, NIPA
  3. O ko le lo awọn itọni tabili ati awọn gbolohun ọrọ Ṣiṣayan
  4. ko si seese lati ṣiṣẹ pẹlu awọn kẹkẹ
  5. Ko ṣee ṣe lati ṣafihan data ni wiwo kan lati awọn tabili oriṣiriṣi

O ṣe pataki lati ranti pe anfani gidi ti lilo wiwo itọka le ṣee ṣe nikan nipasẹ titọka gangan.

Ṣugbọn nigba pipe wiwo, awọn atọka wọnyi le ma ṣee lo, ati lati lo wọn ni gbangba, o gbọdọ pato. PẸLU (NOEXPAND).

Niwon ninu Awọn ibeere LINQ Ko ṣee ṣe lati ṣalaye awọn imọran tabili, nitorinaa o ni lati ṣẹda aṣoju miiran - “apapọ” ti fọọmu atẹle:

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

4) Lilo tabili awọn iṣẹ

Nigbagbogbo ninu Awọn ibeere LINQ Awọn bulọọki nla ti awọn ibeere tabi awọn bulọọki ni lilo awọn iwo pẹlu eto eka kan ṣe ibeere ikẹhin kan pẹlu eka pupọ ati igbekalẹ ipaniyan suboptimal.

Awọn anfani bọtini ti Lilo Awọn iṣẹ Tabili ni Awọn ibeere LINQ:

  1. Agbara, bi ninu ọran ti awọn iwo, lati ṣee lo ati pato bi ohun kan, ṣugbọn o le kọja eto awọn aye igbewọle kan:
    LATI IṢẸ (@param1, @param2 ...)
    Bi abajade, iṣapẹẹrẹ data to rọ le ṣee ṣe
  2. Ninu ọran ti lilo iṣẹ tabili, ko si iru awọn ihamọ to lagbara bi ninu ọran ti awọn iwo atọka ti a ṣalaye loke:
    1. Awọn imọran tabili:
      nipasẹ LINQ O ko le pato iru awọn atọka yẹ ki o lo ati pinnu ipele ipinya data nigbati o n beere.
      Ṣugbọn iṣẹ naa ni awọn agbara wọnyi.
      Pẹlu iṣẹ naa, o le ṣaṣeyọri ero ibeere ipaniyan igbagbogbo, nibiti awọn ofin fun ṣiṣẹ pẹlu awọn atọka ati awọn ipele ipinya data ti ṣalaye.
    2. Lilo iṣẹ naa ngbanilaaye, ni afiwe pẹlu awọn iwo atọka, lati gba:
      • Ilana iṣapẹẹrẹ data eka (paapaa lilo awọn losiwajulosehin)
      • gbigba data lati ọpọlọpọ awọn oriṣiriṣi tabili
      • lilo UNION и YATO

  3. Gbolohun Ṣiṣayan wulo pupọ nigbati a nilo lati pese iṣakoso concurrency Àyàn (MAXDOP N), aṣẹ eto ipaniyan ibeere. Fun apere:
    • o le pato ẹda ti o fi agbara mu ti ero ibeere naa Aṣayan (ATUNPỌ)
    • o le pato boya lati fi ipa mu ero ibeere lati lo aṣẹ apapọ ti a pato ninu ibeere naa ASAYAN

    Awọn alaye diẹ sii nipa Ṣiṣayan ṣàpèjúwe nibi.

  4. Lilo bibẹ data ti o dín julọ ati ti o nilo julọ:
    Ko si iwulo lati tọju awọn eto data nla sinu awọn caches (bii ọran pẹlu awọn iwo atọka), lati eyiti o tun nilo lati ṣe àlẹmọ data nipasẹ paramita.
    Fun apẹẹrẹ, tabili kan wa ti àlẹmọ Nibo meta oko lo (a, b, c).

    Ni aṣa, gbogbo awọn ibeere ni ipo igbagbogbo a = 0 ati b = 0.

    Sibẹsibẹ, ibeere fun aaye naa c diẹ oniyipada.

    Jẹ ki ipo naa a = 0 ati b = 0 O ṣe iranlọwọ fun wa gaan lati ṣe idinwo eto abajade ti a beere si ẹgbẹẹgbẹrun awọn igbasilẹ, ṣugbọn ipo lori с dín yiyan si isalẹ lati ọgọrun igbasilẹ.

    Nibi iṣẹ tabili le jẹ aṣayan ti o dara julọ.

    Pẹlupẹlu, iṣẹ tabili kan jẹ asọtẹlẹ diẹ sii ati ni ibamu ni akoko ipaniyan.

Awọn apẹẹrẹ

Jẹ ki a wo imuse apẹẹrẹ ni lilo data data Awọn ibeere bi apẹẹrẹ.

Ibere ​​kan wa Yan, eyi ti o dapọ awọn tabili pupọ ti o si nlo wiwo kan (OperativeQuestions), ninu eyiti a ti ṣayẹwo ifaramọ nipasẹ imeeli (nipasẹ YATO) si “Awọn ibeere Iṣiṣẹ”:

Ibere ​​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])
));

Wiwo naa ni eto ti o ni idiju kuku: o ni awọn akojọpọ abẹlẹ ati lilo yiyan YÀTỌ, eyi ti o jẹ ni apapọ kan iṣẹtọ awọn oluşewadi-lekoko isẹ.

Apeere lati Awọn ibeere Operative jẹ nipa awọn igbasilẹ ẹgbẹrun mẹwa.

Iṣoro akọkọ pẹlu ibeere yii ni pe fun awọn igbasilẹ lati ibeere ita, ṣiṣe abẹlẹ ti inu ni wiwo [OperativeQuestions], eyiti o yẹ fun [Imeeli] = @p__linq__0 a ni opin aṣayan iṣẹjade (nipasẹ YATO) to awọn ọgọọgọrun awọn igbasilẹ.

Ati pe o le dabi pe ibeere yẹ ki o ṣe iṣiro awọn igbasilẹ lẹẹkan nipasẹ [Email] = @p__linq__0, ati lẹhinna awọn igbasilẹ ọgọọgọrun wọnyi yẹ ki o sopọ nipasẹ Id pẹlu Awọn ibeere, ibeere naa yoo yara.

Ni otitọ, asopọ lẹsẹsẹ kan wa ti gbogbo awọn tabili: ṣiṣayẹwo ifọrọranṣẹ ti Awọn ibeere Id pẹlu Id lati Awọn ibeere Iṣiṣẹ, ati sisẹ nipasẹ Imeeli.

Ni otitọ, ibeere naa n ṣiṣẹ pẹlu gbogbo ẹgbẹẹgbẹrun awọn igbasilẹ Awọn ibeere Operative, ṣugbọn data ti iwulo nikan ni o nilo nipasẹ Imeeli.

Awọn ibeere Iṣiṣẹ wo ọrọ:

Ibere ​​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));

Iṣaworan wiwo akọkọ ni 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");
    }
}

Ibeere LINQ akọkọ

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

Ni ọran pataki yii, a n gbero ojutu kan si iṣoro yii laisi awọn ayipada amayederun, laisi ṣafihan tabili lọtọ pẹlu awọn abajade ti a ti ṣetan (“Awọn ibeere ti nṣiṣe lọwọ”), eyiti yoo nilo ẹrọ kan fun kikun pẹlu data ati mimu ki o wa titi di oni. .

Botilẹjẹpe eyi jẹ ojutu ti o dara, aṣayan miiran wa lati mu iṣoro yii pọ si.

Idi pataki ni lati kaṣe awọn titẹ sii nipasẹ [Email] = @p__linq__0 lati iwo OperativeQuestions.

Ṣe afihan iṣẹ tabili [dbo].[OperativeQuestionsUserMail] sinu ibi ipamọ data.

Nipa fifiranṣẹ Imeeli bi paramita igbewọle, a gba tabili awọn iye pada pada:

Ibere ​​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

Eyi da tabili awọn iye pada pẹlu eto data ti a ti yan tẹlẹ.

Ni ibere fun awọn ibeere si OperativeQuestionsUserMail lati jẹ aipe ati ni awọn ero ibeere to dara julọ, eto ti o muna ni a nilo, kii ṣe PADA tabili AS IPADABO...

Ni ọran yii, Ibeere 1 ti o nilo ti yipada si ibeere 4:

Ibere ​​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]);

Awọn iwo aworan aworan ati awọn iṣẹ ni 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})");
}

Ibeere LINQ ipari

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

Ilana ti akoko ipaniyan ti lọ silẹ lati 200-800 ms, si 2-20 ms, ati bẹbẹ lọ, ie awọn igba mẹwa ni iyara.

Ti a ba mu diẹ sii ni apapọ, lẹhinna dipo 350 ms a ni 8 ms.

Lati awọn anfani ti o han gbangba a tun gba:

  1. idinku gbogbogbo ni fifuye kika,
  2. idinku pataki ni o ṣeeṣe ti ìdènà
  3. idinku apapọ akoko idinamọ si awọn iye itẹwọgba

ipari

Imudara ati atunṣe itanran ti awọn ipe data data MS SQL nipasẹ LINQ jẹ iṣoro ti o le yanju.

Ifarabalẹ ati aitasera ṣe pataki pupọ ninu iṣẹ yii.

Ni ibẹrẹ ilana:

  1. o jẹ dandan lati ṣayẹwo data pẹlu eyiti ibeere naa n ṣiṣẹ (awọn iye, awọn iru data ti a yan)
  2. ṣe atọka to dara ti data yii
  3. ṣayẹwo awọn titunse ti dida awọn ipo laarin awọn tabili

Iṣatunṣe iṣapeye atẹle ti n ṣafihan:

  1. ipilẹ ibeere ati asọye àlẹmọ ibeere akọkọ
  2. tun iru awọn bulọọki ibeere ati itupalẹ ikorita ti awọn ipo
  3. ni SSMS tabi GUI miiran fun Asise SQL optimizes ara SQL ibeere (pinpin ibi ipamọ data agbedemeji kan, kọ ibeere abajade nipa lilo ibi ipamọ yii (le jẹ pupọ))
  4. ni ipele ti o kẹhin, mu bi ipilẹ abajade SQL ibeere, eto naa ti wa ni atunṣe LINQ ibeere

Abajade LINQ ibeere yẹ ki o di aami ni be si awọn damo ti aipe SQL ibeere lati aaye 3.

Awọn ijẹwọ

Ọpọlọpọ ọpẹ si awọn ẹlẹgbẹ jobgemws и alex_osr lati ile-iṣẹ naa Fortis fun iranlọwọ ni igbaradi ohun elo yii.

orisun: www.habr.com

Fi ọrọìwòye kun