Создайте универсальный метод, в котором выражение может быть передано в качестве параметра для выполнения динамических запросов. - PullRequest
0 голосов
/ 14 октября 2011

Я использую EF. и шаблон хранилища.

Конкретный вопрос заключается в том, как я могу написать приведенное ниже GetPositionByCustomExpression, чтобы из вызывающей стороны я мог передать выражение, иногда выражение может содержать один фильтр или 2 или даже выражение может содержать порядок?

     public interface IPositionRepository
        {
            void CreateNewPosition(Position contactToCreate);
            void DeletePosition(int id);
            Position GetPositionByID(int id);
            IEnumerable<Position> GetAllPositions();
            int SaveChanges();
            IEnumerable<Position> GetPositionByCustomExpression();  //---> What to put here??
        }


public class PositionRepository : IPositionRepository
    {

        private HRContext _db = new HRContext();

        public Position GetPositionByID(int id)
        {
            return _db.Positions.FirstOrDefault(d => d.PositionID == id);
        }

        public IEnumerable<Position> GetAllPosition()
        {
            return _db.Positions.ToList();
        }

        public void CreateNewContact(Position positionToCreate)
        {
            _db.Positions.Add(positionToCreate);
            _db.SaveChanges();
        }

        public int SaveChanges()
        {
            return _db.SaveChanges();
        }

        public void DeletePosition(int id)
        {
            var posToDel = GetPositionByID(id);
            _db.Positions.Remove(posToDel);
            _db.SaveChanges();
        }

        /// <summary>
        /// Lets suppose we have a field called name, another years of experience, and another department.
        /// How can I create a generic way in ONE simple method to allow the caller of this method to pass
        /// 1, 2 or 3 parameters.
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Position> GetPositionByCustomExpression()   // --> What to put here?
        {
            _db.Positions.Find(); // ---> and here??

        }

1 Ответ

1 голос
/ 14 октября 2011

Вы можете использовать параметр типа Expression<Func<Position, bool>> для метода

public interface IPositionRepository
    {
        //others
        IEnumerable<Position> GetPositionByCustomExpression(Expression<Func<Position, bool>> predicate);
    }

public class PositionRepository : IPositionRepository
{

    public IEnumerable<Position> GetPositionByCustomExpression(Expression<Func<Position, bool>> predicate)
    {
        _db.Positions.Where(predicate);

    }
 }

Тогда вы можете использовать предикаты следующим образом

var positions = repository
.GetPositionByCustomExpression(p => p.Name.StartsWith("Foo") && p.BasicSalary > 100000)
...