Toon posts:

Linq probleem

Pagina: 1
Acties:

Onderwerpen


  • original4u
  • Registratie: maart 2002
  • Laatst online: 27-09 15:29
Weet iemand het volgende probleem:

Onderstaande SQL query wil ik in LINQ maken.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT 
  "Question"."QuestionText", 
  "Answer"."AnswerText", 
  "Professional"."FirstName", 
  "Professional"."Surname", 
  "Career"."JobTitle",
  "Answer"."InterviewFormID", 
  "InterviewForm"."ProfessionalID"
  
FROM 
  public."Answer", 
  public."Professional", 
  public."Question", 
  public."InterviewForm",
  public."Career"
WHERE 
  "Answer"."InterviewFormID" = "InterviewForm"."InterviewFormID" AND
  "Answer"."QuestionID" = "Question"."QuestionID" AND
  "InterviewForm"."ProfessionalID" = "Professional"."ProfessionalID" AND
  "Career"."CareerID" =  "Professional"."CareerID" AND
  
  "Question"."QuestionText" = '15. What do you like most about your job?'
ORDER BY
  "Question"."QuestionText" ASC, 
  "Answer"."AnswerText" ASC;



C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            var queryQuestionaire =
                from q in _context.Question
                from c in _context.Career
                from i in _context.InterviewForm
                from p in _context.Professional

                join b in _context.Answer on i.InterviewFormID equals  b.InterviewForm.InterviewFormID
                join a in _context.Answer on q.QuestionID equals a.Question.QuestionID
                join l in _context.InterviewForm on p.ProfessionalID equals l.Professional.ProfessionalID
                join d in _context.Professional on c.CareerID equals d.Career.CareerID
                
                where q.QuestionText == "15. What do you like most about your job?"
                
                select new {q.QuestionText, a.AnswerText, p.FirstName, p.Surname};


Echter geeft de SQL query het gewenste resultaat, namelijk 1 regel. Maar de LINQ query geeft 200 keer dezelfde regel. Moet ik in LINQ anders joinen?
Ik hoop dat iemand dat kan bevestigen.

  • thioz
  • Registratie: september 2001
  • Laatst online: 06-11-2018
Ik weet niet echt veel van LINQ, maar volgens mij ligt het aan de regel : ' where q.QuestionText == "15. What do you like most about your job?"' ... deze zal (denk ik) maar één resultaat geven , gezien je een JOIN op de Question tabel doet.

ik denk dat de query had moeten zijn :
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
SELECT 
  "Question"."QuestionText", 
  "Answer"."AnswerText", 
  "Professional"."FirstName", 
  "Professional"."Surname", 
  "Career"."JobTitle",
  "Answer"."InterviewFormID", 
  "InterviewForm"."ProfessionalID"
  
FROM 
  public."Answer" 
 LEFT JOIN 
  public."Question" 
 ON  
    "Answer"."QuestionID" = "Question"."QuestionID"
 LEFT JOIN 
  public."InterviewForm" 
 ON 
    "Answer"."InterviewFormID" = "InterviewForm"."InterviewFormID"
 LEFT JOIN 
  public."Professional" 
 ON 
    "InterviewForm"."ProfessionalID" = "Professional"."ProfessionalID"
 LEFT JOIN 
  public."Career" 
 ON 
    "Career"."CareerID" =  "Professional"."CareerID"
WHERE 
    "Answer"."QuestionID" = <QUESTIONID>
  
ORDER BY
  "Question"."QuestionText" ASC, 
  "Answer"."AnswerText" ASC;

I feel like i've been taking crazy pills


  • boe2
  • Registratie: november 2002
  • Niet online

boe2

'-')/

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  var queryQuestionaire = 
                (from q in _context.Question 
                from c in _context.Career 
                from i in _context.InterviewForm 
                from p in _context.Professional 

                join b in _context.Answer on i.InterviewFormID equals  b.InterviewForm.InterviewFormID 
                join a in _context.Answer on q.QuestionID equals a.Question.QuestionID 
                join l in _context.InterviewForm on p.ProfessionalID equals l.Professional.ProfessionalID 
                join d in _context.Professional on c.CareerID equals d.Career.CareerID 
                 
                where q.QuestionText == "15. What do you like most about your job?" 
                 
                select new {q.QuestionText, a.AnswerText, p.FirstName, p.Surname}).First()

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


  • original4u
  • Registratie: maart 2002
  • Laatst online: 27-09 15:29
@BoeBoe. Thx je hebt me in de juiste richting geholpen. Het aanroepen van .First is niet de oplossing. Als er meerdere "rows" gevonden worden pakt hij altijd alleen de eerste. Wat ik nu doe is .Distinct(); aanroepen :) Al is de linq query nog steeds fout imho aangezien er meerdere dubbele rows uitkomen.
Maar ik heb nu iig het gewenste resultaat! Ga het nu nog even goed testen. Ik zal een update geven.

  • Wallie
  • Registratie: januari 2000
  • Laatst online: 08:18

Wallie

Herr

Anders kijk eens met profiler wat er op de achtergrond voor SQL uit komt, kan je ook een hint geven wat je verkeerd doet.

....Mooie vrouwen maken me bang. Ze veroorzaken meer problemen dan mooie mannen, die zijn meestal verlegen. Mooie vrouwen hebben echter geleerd met hun schoonheid te handelen en ze maken er nog misbruik van ook...


  • Grijze Vos
  • Registratie: december 2002
  • Laatst online: 24-09 13:37
Dit zijn de twee equivalenten in sql.
SQL:
1
2
3
4
5
6
7
select *
from a, b
where a.id = b.id;

select *
from a left join b
  on a.id = b.id;


Wat je nu doet is eerst 4x een cartesisch product nemen met al die froms, en dan ga je joinen. Je doet dus twee keer dezelfde tabel meenemen in je linq expressie.

@boeboe, First is geen oplossing als je query fout is. Dit soort "oplossingen" zijn geen oplossingen, alleen hackpogingen die niet alleen bugs verstoppen, maar ook nog eens je performance nekken op de lange termijn.

[Voor 25% gewijzigd door Grijze Vos op 10-11-2010 11:27]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • original4u
  • Registratie: maart 2002
  • Laatst online: 27-09 15:29
@Grijze Vos
Je hebt gelijk ik zie dat ik nu waarden door elkaar te zien krijg in de rows. Een from kan je dus als een foreach zien in deze notatie. Alleen heb ik geen idee hoe ik het nu moet oplossen :/

Ik gebruik trouwens PostgreSQL. Zit daar ook een soort profiler bij? :)

[Voor 16% gewijzigd door original4u op 10-11-2010 12:17]


  • Sebazzz
  • Registratie: september 2006
  • Laatst online: 08:06
original4u schreef op woensdag 10 november 2010 @ 12:16:
Ik gebruik trouwens PostgreSQL. Zit daar ook een soort profiler bij? :)
Wat ik deed toen ik in ASP.NET ontwikkelde met Linq, is gewoon een breakpoint gooien na je Linq statement. "queryQuestionaire" is namelijk een IQueryable<T>, als je er in de debugger overheen hovert zie je wat voor query hij genereert. Mogelijk werkt een .ToString ook als je het wil loggen, maar dat moet je op MSDN opzoeken.

[Website en online portfolio] [Return: realtime retrospective tool] [PokerTime planning poker]


  • EfBe
  • Registratie: januari 2000
  • Niet online
Wat gebruik je trouwens? Entity Framework v4?
original4u schreef op woensdag 10 november 2010 @ 09:53:
Weet iemand het volgende probleem:

Onderstaande SQL query wil ik in LINQ maken.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT 
  "Question"."QuestionText", 
  "Answer"."AnswerText", 
  "Professional"."FirstName", 
  "Professional"."Surname", 
  "Career"."JobTitle",
  "Answer"."InterviewFormID", 
  "InterviewForm"."ProfessionalID"
  
FROM 
  public."Answer", 
  public."Professional", 
  public."Question", 
  public."InterviewForm",
  public."Career"
WHERE 
  "Answer"."InterviewFormID" = "InterviewForm"."InterviewFormID" AND
  "Answer"."QuestionID" = "Question"."QuestionID" AND
  "InterviewForm"."ProfessionalID" = "Professional"."ProfessionalID" AND
  "Career"."CareerID" =  "Professional"."CareerID" AND
  
  "Question"."QuestionText" = '15. What do you like most about your job?'
ORDER BY
  "Question"."QuestionText" ASC, 
  "Answer"."AnswerText" ASC;
Dit zijn inner joins, dus je kunt ze beter opschrijven als inner joins ipv een cross join from clause met een serie where clauses.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            var queryQuestionaire =
                from q in _context.Question
                from c in _context.Career
                from i in _context.InterviewForm
                from p in _context.Professional

                join b in _context.Answer on i.InterviewFormID equals  b.InterviewForm.InterviewFormID
                join a in _context.Answer on q.QuestionID equals a.Question.QuestionID
                join l in _context.InterviewForm on p.ProfessionalID equals l.Professional.ProfessionalID
                join d in _context.Professional on c.CareerID equals d.Career.CareerID
                
                where q.QuestionText == "15. What do you like most about your job?"
                
                select new {q.QuestionText, a.AnswerText, p.FirstName, p.Surname};

Echter geeft de SQL query het gewenste resultaat, namelijk 1 regel. Maar de LINQ query geeft 200 keer dezelfde regel. Moet ik in LINQ anders joinen?
Ik hoop dat iemand dat kan bevestigen.
Dit klopt niet. je hebt nested 'from' clauses in de query, die vormen een cross join en daarna ga je met 'join' in de weer. Dit kan veel slimmer:

C#:
1
2
var q = from a in _context.Answer
          select new { a.AnswerText, a.Question.QuestionText, a.InterviewForm.Professional.FirstName, a.InterviewForm.Professional.SurName, a.InterviewForm.Professional.Career.JobTitle, a.InterviewForm.ProfessionalID, a.InterviewFormID};


mocht dit problemen opleveren doordat de Linq provider de mist ingaat met de navigation in de projectie, dan kun je ook joinen:
C#:
1
2
3
4
5
6
var q = from a in _context.Answer
          join q in _context.Question on a.QuestionID equals q.QuestionID
          join i in _context.InterviewForm on a.InterviewFormID equals i.InterviewFormID
          join p in _context.Professional on i.ProfessionalID equals p.ProfessionalID
          join c in _context.Career on p.CareerID equals c.CareerID
          select new { q.QuestionText, a.AnswerText, p.FirstName, p.SurName, c.JobTitle, i.InterviewFormID, p.ProfessionalID};

Lead developer of LLBLGen Pro.
https://fransbouma.com


  • original4u
  • Registratie: maart 2002
  • Laatst online: 27-09 15:29
EfBe schreef op woensdag 10 november 2010 @ 13:22:

mocht dit problemen opleveren doordat de Linq provider de mist ingaat met de navigation in de projectie, dan kun je ook joinen:
C#:
1
2
3
4
5
6
var q = from a in _context.Answer
          join q in _context.Question on a.QuestionID equals q.QuestionID
          join i in _context.InterviewForm on a.InterviewFormID equals i.InterviewFormID
          join p in _context.Professional on i.ProfessionalID equals p.ProfessionalID
          join c in _context.Career on p.CareerID equals c.CareerID
          select new { q.QuestionText, a.AnswerText, p.FirstName, p.SurName, c.JobTitle, i.InterviewFormID, p.ProfessionalID};
Holy &#($, it works!

Uiteindelijk heb ik er dit van gemaakt:

C#:
1
2
3
4
5
6
7
8
9
 var queryQuestionaire = from a in _context.Answer
                    join q in _context.Question on a.Question.QuestionID equals q.QuestionID
                    join i in _context.InterviewForm on a.InterviewForm.InterviewFormID equals i.InterviewFormID
                    join p in _context.Professional on i.Professional.ProfessionalID equals p.ProfessionalID
                    join c in _context.Career on p.Career.CareerID equals c.CareerID
                    
                    where q.QuestionText == "15. What do you like most about your job?"

                    select new { q.QuestionText, a.AnswerText, p.FirstName, p.Surname, c.JobTitle, i.InterviewFormID, p.ProfessionalID };


(Ik moest bij sommige nog wat toevoegen anders kon hij ze niet gelijk resolven.)
Uitgebreid getest en het werkt. Nu snap ik Linq wat beter. Thx iedereen. :)
En +1 voor "EfBe"! _/-\o_

  • EfBe
  • Registratie: januari 2000
  • Niet online
Tja, ik zie linq niet voor het eerst ;)

Lead developer of LLBLGen Pro.
https://fransbouma.com

Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee