Linq probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • original4u
  • Registratie: Maart 2002
  • Laatst online: 11-09 10:46
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.

Acties:
  • 0 Henk 'm!

Verwijderd

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;

Acties:
  • 0 Henk 'm!

  • 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.


Acties:
  • 0 Henk 'm!

  • original4u
  • Registratie: Maart 2002
  • Laatst online: 11-09 10:46
@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.

Acties:
  • 0 Henk 'm!

  • Wallie
  • Registratie: Januari 2000
  • Laatst online: 09:14

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.

Dat is niet gênant, dat is professioneel.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
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


Acties:
  • 0 Henk 'm!

  • original4u
  • Registratie: Maart 2002
  • Laatst online: 11-09 10:46
@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 ]


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 06:48

Sebazzz

3dp

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.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • 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};

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • original4u
  • Registratie: Maart 2002
  • Laatst online: 11-09 10:46
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_

Acties:
  • 0 Henk 'm!

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

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1