andreas_g Δημοσ. 17 Φεβρουαρίου 2016 Δημοσ. 17 Φεβρουαρίου 2016 Καλησπέρα, έχω μια βάση, που φαίνεται στην εικόνα. Προσπαθώ, γνωρίζοντας το 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().
kagelos Δημοσ. 17 Φεβρουαρίου 2016 Δημοσ. 17 Φεβρουαρίου 2016 Φαντάζομαι πως χρησιμοποιείς 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
Papakaliati Δημοσ. 17 Φεβρουαρίου 2016 Δημοσ. 17 Φεβρουαρίου 2016 Δεν χρειαζεσαι 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;
andreas_g Δημοσ. 17 Φεβρουαρίου 2016 Μέλος Δημοσ. 17 Φεβρουαρίου 2016 Φαντάζομαι πως χρησιμοποιείς 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 και να κάνω τη σύγκριση? Και να τα πάρω όλα φυσικά... Ευχαριστώ πάντως παιδιά...
Papakaliati Δημοσ. 17 Φεβρουαρίου 2016 Δημοσ. 17 Φεβρουαρίου 2016 Επειδή αυτό είναι για άσκηση δεν μπορώ ούτε να αλλάξω τη βάση ούτε να χρησιμοποιήσω 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 και να κάνω τη σύγκριση? Και να τα πάρω όλα φυσικά... Ευχαριστώ πάντως παιδιά... 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 == β
andreas_g Δημοσ. 17 Φεβρουαρίου 2016 Μέλος Δημοσ. 17 Φεβρουαρίου 2016 Βγήκε... χρησιμοποιώντας 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 γράφονται και σε ένα για να φαίνεται πιο ωραίο?
Papakaliati Δημοσ. 17 Φεβρουαρίου 2016 Δημοσ. 17 Φεβρουαρίου 2016 Βγήκε... χρησιμοποιώντας 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, η οχι, πρεπει να το τσεκαρεις αν και νομιζω οτι ειναι σωστο ετσι.
andreas_g Δημοσ. 18 Φεβρουαρίου 2016 Μέλος Δημοσ. 18 Φεβρουαρίου 2016 Αυτό ακριβώς είναι. Δουλεύει με τον ίδιο τρόπο... ευχαριστώ. Εγώ δεν θα το έβγαζα ποτέ. Δεν μου λες, έχω αυτή τη φωτογραφία για να βλέπω τα joins, αυτό που γίνεται εδώ είναι η πρώτη περίπτωση?
Papakaliati Δημοσ. 18 Φεβρουαρίου 2016 Δημοσ. 18 Φεβρουαρίου 2016 Το πρωτο. Γενικως αμα βλεπεις σκετο join, εννοειται παντα inner join. Στην sql μαλιστα μπορεις να γραψεις inner join h join, ειναι το ιδιο πραγμα. Linq βεβαια μονο Join μπορεις να γραψεις, αλλα εννοειται σαν inner join. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα