Link to home
Create AccountLog in
Avatar of flynny
flynnyFlag for United Kingdom of Great Britain and Northern Ireland

asked on

C# Generic Extension Method Help

Hi All,

I am trying to create a generic extension method for converting a List<T> to a List<SelectListItem> for dropdown lists in the view.

Now, I have the following Generic Repository System

    public interface IRepository<T>
    {
        void Insert(T entity);
        void Update(T entity);
        void Delete(T entity);
        IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
        IQueryable<T> GetAll();
        IOrderedEnumerable<T> GetPage(int pageIndex, int pageSize, string sortBy, string sortDirection);
        T GetById(int id);
    }

Open in new window


   public class Repository<T> : IRepository<T> where T : class, IEntity
    {
        protected Table<T> DataTable;

        public Repository(DBDataContext dataContext)
        {
            DataTable = dataContext.GetTable<T>();
        }
        
        public Repository(DataContext dataContext)
        {
            DataTable = dataContext.GetTable<T>();
        }

        #region IRepository<T> Members

        public void Insert(T entity)
        {
            DataTable.InsertOnSubmit(entity);
        }

        public void Update(T entity)
        {
            DataTable.Attach(entity, true);
        }

        public void Delete(T entity)
        {
            DataTable.DeleteOnSubmit(entity);
        }

        public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
        {
            return DataTable.Where(predicate);
        }

        public IQueryable<T> GetAll()
        {
            return DataTable;
        }

        public IOrderedEnumerable<T> GetPage(int pageIndex = 0, int pageSize = 10, string sortBy = "ID", string sortDirection = "asc")
        {
            var param = Expression.Parameter(typeof(T));

            var sortExpression = Expression.Lambda<Func<T, object>>
                (Expression.Convert(Expression.Property(param, sortBy), typeof(object)), param).Compile();

            var results = DataTable.Skip((pageIndex - 1)*pageSize).Take(pageSize);

            switch (sortDirection.ToLower())
            {
                case "asc":
                    return results.OrderBy(sortExpression);
                default:
                    return results.OrderByDescending(sortExpression);
            }
        }

        public T GetById(int id)
        {
            return DataTable.Single(e => e.ID.Equals(id));
        }

        #endregion
    }

Open in new window


Where I entity is simply enforcing the ID

    public interface IEntity
    {
        int ID { get; }
    }

Open in new window


All the classes in my DBML are implementing IEntity.

and My Extensions Class is simply;

public static class RepositoryExtensions
    {
       public static IEnumerable<SelectListItem> ToSelectListItems<T>(
            this IEnumerable<T> items,
            Func<T, string> nameSelector,
            Func<T, string> valueSelector,
            Func<T, bool> selected)
       {
           return items.OrderBy(item => nameSelector(item))
                  .Select(item =>
                          new SelectListItem
                          {
                              Selected = selected(item),
                              Text = nameSelector(item),
                              Value = valueSelector(item)
                          });
       }
    }

Open in new window


Now for example when I try to get a dropdown list for all countries in my datbase as an example I have and call the following method

public static List<Country> GetCountries()
        {
            using (DBDataContext db = new DBDataContext())
            {
                return db.Countries.OrderBy(c => c.NiceName).ToList();
            }
        }

Open in new window


which I implment in the view as follows;

@Html.DropDownListFor(x => x.ID, Core.MiscRepository.GetCountries().ToSelectListItems("ID", "NiceName", true))

Open in new window


however, its not finding the extension method? Could anyone point me in the right direction please?

Many Thanks in Advance,

Matt.
Avatar of Gururaj Badam
Gururaj Badam
Flag of India image

Try including the extension method namespace in the Controller file where you have GetCountries defined.
ASKER CERTIFIED SOLUTION
Avatar of kaufmed
kaufmed
Flag of United States of America image

Link to home
membership
Create an account to see this answer
Signing up is free. No credit card required.
Create Account