Results 1 to 7 of 7

Thread: C# - TSQL to EF LAMBDA

  1. #1
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    967

    C# - TSQL to EF LAMBDA

    Nu weet ik dat hier ook wat C# mensen zitten, vandaar de vraag:

    Volgende TSQL statement:
    Code:
      DECLARE @offset INT=0;
      SELECT TOP 1 
        [t1].[MyINT]+1 AS [MyINT]
      FROM [MyTable] [t1]
      WHERE (NOT ([t1].[MyINT] IS NULL))
        AND ([t1].[MyINT]>@offset)
        AND (NOT EXISTS(SELECT * FROM [MyTable] [t2] WHERE [t2].[MyINT]>@offset AND [t2].[MyINT]=[t1].[MyINT]+1))
      ORDER BY [t1].[MyINT]
    Hoe krijg je de laatste "NOT Exists" in de EF LAMBDA?

    Zal iets worden als:
    Code:
    int offset = 0;
    var item = db.MyTable.Where(x => x.MyINT != null && x.MyINT > offset).OrderBy(x => x.MyINT).First();
    maar daar moet dus nog die "NOT Exists" bij...
    Objective reality is a delirium caused by lack of alcohol in blood

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Dat is een gehele subquery. kan dat wel?

  3. #3
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    967
    Mag toch hopen dat dit kan. Dit is een vrij standaard constructie om het eerste niet vrije nummer te verkrijgen op basis van een offset.
    En ja, uiteraard kun je dit allemaal in je SQL database regelen (function/identity), maar dat mag ik helaas niet. Zit vast aan EF hiervoor.
    Nu kan ik dat wel in 2 calls stoppen, dus eerst lijst ophalen en dan een contains, maar lijkt me als dat in 2 calls mag dit in 1 ook te doen moet zijn.

    Dit komt aardig in de richting, maar op de 1 of andere manier geeft het niet het resultaat dat ik zou verwachten:
    Code:
                        var setting = db.MyTable
                            .Where(x => x.MyINT != null && 
                                        x.MyINT > offset && 
                                        !db.MyTable
                                            .Any(y => y.MyINT > offset && 
                                                      y.MyINT == (x.MyINT + 1)))
                            .OrderBy(x => x.MyINT).First();
    Nog ff controleren of dat aan mijn verwachting ligt of dat EF hier toch wat raars van bakt
    Objective reality is a delirium caused by lack of alcohol in blood

  4. #4
    Ik stem ook op de !Any(), dat genereert volgens mij precies wat je zoekt.
    Marcel

  5. #5
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    967
    Deze voldeed inderdaad. Ging fout in een extra validatie die ik hier weg gelaten had (om het niet onnodig complex te maken).
    Maar ondertussen is alles opgelost en werkt het zoals gewenst
    Objective reality is a delirium caused by lack of alcohol in blood

  6. #6
    En nu wachten op het omslagpunt dat je niet in SQL to Linq denkt, maar direct in Linq . Ik ben er zelf voor zo'n 80%, maar voor de echt lastige gaat mijn hoofd toch nog in SQL denken.
    Marcel

  7. #7
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    967
    Dat omslagpunt duurt nog ff ben ik bang. De laatste paar jaar echt vanuit SQL moeten denken.
    Simpele joins en wat where lukt me wel direct, bovenstaande fratsen blijft drama.

    Om daarna maar te kijken als het resultaat niet is als gewenst wat EF er voor mooie TSQL van gebakken heeft.
    Nee, de liefde moet nog groeien...
    Objective reality is a delirium caused by lack of alcohol in blood

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •