Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

 

έχω μια βάση, που φαίνεται στην εικόνα. Προσπαθώ, γνωρίζοντας το EMP_ID, να βρω όλα τα ATTR_ID.

 

Πρώτα προσπαθώ να βρώ όλα τα EMPATTR_Employee_ID από τον πίνακα EmployeeAttribute με αυτό 

var v = from ea in dc.EmployeeAttributes
        where ea.EMPATTR_EmployeeID == employeeID
        select ea;

Και μετά προσπαθώ να βρώ όλα τα ATTR_ID από τον πίνακα Attribute με αυτό

var vv = from a in dc.Attributes
         where a.ATTR_ID == v.First().EMPATTR_AttributeID
         select a;

Το θέμα είναι ότι στη βάση υπάρχουν παραπάνω Attributes για κάθε employee και αυτό που κάνω μου επιστρέφει μόνο ένα Attribute τη φορά.

 

Δεν μπορώ να καταλάβω που κάνω λάθος, νόμιζα ότι η κάθε κλήση θα μου τα έδεινε όλα...

 

Το dc είναι ένα αντικείμενο που δημιούργησα στο visual studio με το Linq to SQL.

Όλο το νταραβέρι γίνεται για να πάρω το Model που θα βγει και να το περάσω σε μια PartialView().

 

post-143245-0-66898700-1455666977_thumb.png

Δημοσ.

Φαντάζομαι πως χρησιμοποιείς Entity Framework. Στο EF λοιπόν, τους ενδιάμεσους πίνακες (junction tables) σε σχέσεις many to many δεν τους δηλώνουμε ως entities, οπότε λογικά δεν θα έπρεπε να έχεις entity (κλάση) EmployeeAttribute, παρόλο που ο πίνακας υπάρχει. Θα έπρεπε όμως το entity Attribute να έχει property Employees και το entity Employee να έχει αντίστοιχα property Attributes. Αν τα φτιάξεις αυτά, τότε το query σου θα έπρεπε να είναι ως εξής:

var attributes = from emp in dc.Employees
                 where emp.ID == 123
                 select emp.Attributes

Δες και εδώ http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

Δημοσ.

Δεν χρειαζεσαι 2 διαφορετικα queries καταρχην, μπορεις απλα να κανεις :

var query = from firstItem in list1

                          join secondItem in list2
                          on firstItem equals secondItem
                          select firstItem

      

Στην περιπτωση σου αποτι βλεπεις κανεις 

     var vv = from a in dc.Attributes

                   where a.ATTR_ID == v.First().EMPATTR_AttributeID
                   select a;

συγκρινεις το πρωτο στοιχειο του v δηλαδη μονο.

 

Αυτα ηθελες να αφησεις για καποιον λογο 2 queries θα μπορουσες απλα να κανεις 

 

  var vv = from a in dc.Attributes

                from b in v.EMPATTR_AttributeID

                where a == b

                select a;

         

Δημοσ.

Φαντάζομαι πως χρησιμοποιείς Entity Framework. Στο EF λοιπόν, τους ενδιάμεσους πίνακες (junction tables) σε σχέσεις many to many δεν τους δηλώνουμε ως entities, οπότε λογικά δεν θα έπρεπε να έχεις entity (κλάση) EmployeeAttribute, παρόλο που ο πίνακας υπάρχει. Θα έπρεπε όμως το entity Attribute να έχει property Employees και το entity Employee να έχει αντίστοιχα property Attributes. Αν τα φτιάξεις αυτά, τότε το query σου θα έπρεπε να είναι ως εξής:

var attributes = from emp in dc.Employees
                 where emp.ID == 123
                 select emp.Attributes
Δες και εδώ http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

 

 

Επειδή αυτό είναι για άσκηση δεν μπορώ ούτε να αλλάξω τη βάση ούτε να χρησιμοποιήσω Entity, για αυτό πάω με Linq to SQL.

Αλλά για να καταλάβω, μου λες στην ουσία, ότι καλύτερο θα ήταν να μην έχω ενδιάμεσο πίνακα και να βάλω ως foreign key στον ένα πίνακα το primary key του άλλου και τ'ανάποδο?

 

 

Δεν χρειαζεσαι 2 διαφορετικα queries καταρχην, μπορεις απλα να κανεις :

var query = from firstItem in list1

                          join secondItem in list2

                          on firstItem equals secondItem

                          select firstItem

Εδώ παίρνω αυτό:

The type of one of the expressions in the join clause is incorrect.  Type inference failed in the call to 'Join'

 βάζοντας αυτό:

var vv = from a in dc.Attributes
         join ea in dc.EmployeeAttributes
         on a equals ea
         select a;

Αυτα ηθελες να αφησεις για καποιον λογο 2 queries θα μπορουσες απλα να κανεις 

 

  var vv = from a in dc.Attributes

                from b in v.EMPATTR_AttributeID

                where a == b

                select a;

         

 

και μετά παίρνω αυτό:

'IQueryable<EmployeeAttribute>' does not contain a definition for 'EMPATTR_AttributeID' and 

 

no extension method 'EMPATTR_AttributeID' accepting a first argument of type 'IQueryable<EmployeeAttribute>' 

 

could be found (are you missing a using directive or an assembly reference?)

 

βάζοντας αυτό:

 

var vv = from a in dc.Attributes
         from b in v.EMPATTR_AttributeID
         where a == b
         select a;

Γενικά από ότι καταλαβαίνω χρειάζομαι ένα τρόπο να πάρω το id μέσα από το IQueryable και να το βάλω στη where.

 

 

Στην περιπτωση σου αποτι βλεπεις κανεις 

     var vv = from a in dc.Attributes

                   where a.ATTR_ID == v.First().EMPATTR_AttributeID

                   select a;

συγκρινεις το πρωτο στοιχειο του v δηλαδη μονο.

Εδώ χρησιμοποιώ τη First γιατί προσπαθώ να κάνω σύγκριση id με id. Νόμιζα ότι η select θα τα επέστρεφε όλα και απλά η First θα μου χρησίμευε για να πάρω το id από κάποιο στοιχείο για να μπορώ να κάνω τη σύγκριση.

 

Σε αυτό το query πως θα μπορούσα να πάρω διαφορετικά το id και να κάνω τη σύγκριση? Και να τα πάρω όλα φυσικά...

 

 

Ευχαριστώ πάντως παιδιά...  :-)  :ph34r:

Δημοσ.

 

Επειδή αυτό είναι για άσκηση δεν μπορώ ούτε να αλλάξω τη βάση ούτε να χρησιμοποιήσω Entity, για αυτό πάω με Linq to SQL.

Αλλά για να καταλάβω, μου λες στην ουσία, ότι καλύτερο θα ήταν να μην έχω ενδιάμεσο πίνακα και να βάλω ως foreign key στον ένα πίνακα το primary key του άλλου και τ'ανάποδο?

 

 

Εδώ παίρνω αυτό:

The type of one of the expressions in the join clause is incorrect.  Type inference failed in the call to 'Join'

 βάζοντας αυτό:

var vv = from a in dc.Attributes
         join ea in dc.EmployeeAttributes
         on a equals ea
         select a;

 

και μετά παίρνω αυτό:

'IQueryable<EmployeeAttribute>' does not contain a definition for 'EMPATTR_AttributeID' and 

 

no extension method 'EMPATTR_AttributeID' accepting a first argument of type 'IQueryable<EmployeeAttribute>' 

 

could be found (are you missing a using directive or an assembly reference?)

 

βάζοντας αυτό:

 

var vv = from a in dc.Attributes
         from b in v.EMPATTR_AttributeID
         where a == b
         select a;

Γενικά από ότι καταλαβαίνω χρειάζομαι ένα τρόπο να πάρω το id μέσα από το IQueryable και να το βάλω στη where.

 

 

Εδώ χρησιμοποιώ τη First γιατί προσπαθώ να κάνω σύγκριση id με id. Νόμιζα ότι η select θα τα επέστρεφε όλα και απλά η First θα μου χρησίμευε για να πάρω το id από κάποιο στοιχείο για να μπορώ να κάνω τη σύγκριση.

 

Σε αυτό το query πως θα μπορούσα να πάρω διαφορετικά το id και να κάνω τη σύγκριση? Και να τα πάρω όλα φυσικά...

 

 

Ευχαριστώ πάντως παιδιά...  :-)  :ph34r:

var vv = from a in dc.Attributes
join ea in dc.EmployeeAttributes
on a equals ea
select a;

Φυσικα και δεν ειναι σωστο το παραπανω, μιας θα πρεπει να ειναι ea.ATTR_ID equals a.EMPATTR_AttributeID .

var vv = from a in dc.Attributes
join ea in dc.EmployeeAttributes
on ea.ATTR_ID equals a.EMPATTR_AttributeID 
select a;

ενω το 

var vv = from a in dc.Attributes
from b in v.EMPATTR_AttributeID
where a == b
select a;

αντιστοιχως α.ATTR_ID == β

Δημοσ.

Βγήκε... χρησιμοποιώντας 

var v = from ea in dc.EmployeeAttributes
        where ea.EMPATTR_EmployeeID == employeeID
        select ea;

   και 

var vv = from ea in v
         join a in dc.Attributes
         on ea.EMPATTR_AttributeID equals a.ATTR_ID
         select a;

από τις δοκιμές που έκανα φαίνεται να δουλεύει σωστά.

 

Ευχαριστώ πολύ για τη βοήθεια.  :-)

 

Κάτι τελευταίο. Αυτά τα δυο query γράφονται και σε ένα για να φαίνεται πιο ωραίο? 

Δημοσ.

Βγήκε... χρησιμοποιώντας 

var v = from ea in dc.EmployeeAttributes
        where ea.EMPATTR_EmployeeID == employeeID
        select ea;

   και 

var vv = from ea in v
         join a in dc.Attributes
         on ea.EMPATTR_AttributeID equals a.ATTR_ID
         select a;

από τις δοκιμές που έκανα φαίνεται να δουλεύει σωστά.

 

Ευχαριστώ πολύ για τη βοήθεια.  :-)

 

Κάτι τελευταίο. Αυτά τα δυο query γράφονται και σε ένα για να φαίνεται πιο ωραίο? 

 

Φανταζομαι 

var vv = from ea in dc.EmployeeAttributes
join a in dc.Attributes
on ea.EMPATTR_AttributeID equals a.ATTR_ID
where ea.EMPATTR_EmployeeID == employeeID
select a;

Δεν ειμαι σιγουρος αμα μπορεις να βαλεις το where πριν το join, η οχι, πρεπει να το τσεκαρεις αν και νομιζω οτι ειναι σωστο ετσι.

Δημοσ.

Αυτό ακριβώς είναι. Δουλεύει με τον ίδιο τρόπο... ευχαριστώ. Εγώ δεν θα το έβγαζα ποτέ.

 

Δεν μου λες, έχω αυτή τη φωτογραφία για να βλέπω τα joins, αυτό που γίνεται εδώ είναι η πρώτη περίπτωση?

post-143245-0-37027200-1455755906_thumb.jpg

Δημοσ.

Το πρωτο. Γενικως αμα βλεπεις σκετο join, εννοειται παντα inner join. Στην sql μαλιστα μπορεις να γραψεις inner join h join, ειναι το ιδιο πραγμα. Linq βεβαια μονο Join μπορεις να γραψεις, αλλα εννοειται σαν inner join. 

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...