Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Dynamic Predicates σε Repository pattern

Îåêßíçóå áðü ôï ìÝëïò ssopiadis. Τελευταία δημοσίευση από το μέλος ssopiadis στις 24-03-2010, 19:08. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  24-03-2010, 02:01 57838

    Dynamic Predicates σε Repository pattern

    Γειά σας!
    Κάνω τα πρώτα μου βήματα στα RIA Services με τεχνολογία πρόσβασης Entity Framework 4. Είπα να χρησιμοποιήσω repository pattern (και όχι αυτά τα έτοιμα προκατ του Visual Studio) σε συνδυασμό με Windsor Castle-IoC  για να μπορώ να υλοποιήσω multi tenancy. Γενικώς η εφαρμογή φαίνεται να παίζει έτσι όπως αναμένω. Έχω ένα μικρό πρόβλημα και δεν ξέρω πως να το λύσω: η υλοποίηση του repository pattern είναι η εξής:

    public class Repository<T> : IRepository<T> where T : class
        {
          
            ObjectContext _context;
            IObjectSet<T> _objectSet;

            public Repository(IConnectionStringProvider connectionStringProvider)
            {
                this._context = new iWebShopEntities(connectionStringProvider.ConnectionString);           
                _objectSet = _context.CreateObjectSet<T>();
            }

            public IQueryable<T> AsQueryable()
            {
                return _objectSet;
            }
            public IEnumerable<T> GetAll()
            {
                return _objectSet.ToList();
            }
            public IEnumerable<T> Find(Expression<Func<T, bool>> where)
            {
                return _objectSet.Where(where);
            }
          
            public T Single(Expression<Func<T, bool>> where)
            {
                return _objectSet.Single(where);
            }
            public T First(Expression<Func<T, bool>> where)
            {
                return _objectSet.First(where);
            }
            public void Delete(T entity)
            {
                _objectSet.DeleteObject(entity);
            }
            public void Add(T entity)
            {
                _objectSet.AddObject(entity);
            }
            public void Attach(T entity)
            {
                _objectSet.Attach(entity);
            }
            public void AttachModified(T entity)
            {
                _objectSet.Attach(entity);
                _context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);           
            }
            public void Save()
            {
                _context.SaveChanges();

            }
        }

    Θέλω να μπορώ να δημιουργώ δυναμικά queries (ψάχνοντας κατάλαβα ότι το θέμα μου μάλλον είναι τα λεγόμενα predicates). Όπως βλέπετε έχω ήδη δημιουργήσει την

    public IEnumerable<T> Find(Expression<Func<T, bool>> where)
            {
                return _objectSet.Where(where);
            }

    αλλά δεν μου είναι ξεκάθαρο το πως θα καταφέρω να κάνω κάτι αυτής της μορφής (όπως το έκανα σε LINQ-TO-SQL):

     public IQueryable<Excavation> GetExcavationsByFilter(Excavation excavFilter)
            {
                var query = Excavations;

                if (!String.IsNullOrEmpty(excavFilter.Code))
                {
                    query = query.Where(exc => exc.Code.Contains(excavFilter.Code.Trim()));
                }
                if (!String.IsNullOrEmpty(excavFilter.Prefecture))
                {
                    query = query.Where(exc => exc.Prefecture.Contains(excavFilter.Prefecture.Trim()));
                }

    return query;
            }

    Στο παράδειγμα αυτό χρησιμοποίησα ένα συγκεκριμένο repository και όχι ένα generic όπως σε αυτό που θέλω να υλοποιήσω.

    Κάθε διαφώτιση ... ευπρόσδεκτη!
    Δημοσίευση στην κατηγορία:
  •  24-03-2010, 18:46 57853 σε απάντηση της 57838

    Απ: Dynamic Predicates σε Repository pattern

    Repository σε EF. Ξεκινάς μεγάλη συζήτηση. Ειδικότερα με τις παραξενιές που έχει το EF, τουλάχιστον στην έκδοση 1. Όσον αφορά στην έκδοση 4 περιμένω να βγει η νέα έκδοση του βιβλίου της Julie Lerman. Για αρχή, μπορείς να ρίξεις μια ματιά σ' αυτές τις δύο πηγές (1 και 2). Επίσης, σηκώνει συζήτηση το αν το Repository θα πρέπει να επιστρέφει IQueryable. Σου προτείνω να διαβάσεις εδώ κι εδώ. Όλες οι πηγές αφορούν στην έκδοση 1.0 του EF, αλλά οι αρχές είναι οι ίδιες.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  24-03-2010, 19:08 57854 σε απάντηση της 57838

    Απ: Dynamic Predicates σε Repository pattern

    Τελικά τα πράγματα μάλλον είναι πιο απλά από ότι το περίμενα:
    αν υποθέσουμε ότι έχουμε ένα entity (τύπου Culture) με 3 properties

    Name string

    Displayname string

    CultureId int



    τότε θα μπορούσαμε να συντάξουμε κάτι της μορφής:


    Expression<Func<Culture, bool>> whereClause = c => (
                    (!String.IsNullOrEmpty(FilterCulture.Name) ? c.Name.Contains(FilterCulture.Name) : true) &&
                    (!String.IsNullOrEmpty(FilterCulture.Displayname) ? c.Displayname.Contains(FilterCulture.Displayname) : true) &&
                    (FilterCulture.CultureId > 0 ? c.CultureId == FilterCulture.CultureId : true)
                    );

    Δουλεύει τέλεια!

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems