Как выполнить поиск по нескольким строкам, введенным в одном текстовом поле в mvc3 - PullRequest
0 голосов
/ 21 марта 2012

У меня есть одно текстовое поле с именем Ключевые слова.Пользователь может ввести несколько строк для поиска.Как это возможно в mvc3?Я использую nhibernate в качестве ORM.Могу ли я создать критерии для этого?

Отредактированный сценарий

У меня есть частичное представление для поиска работы на основе следующих значений:

  • Ключевые слова (несколько строк) , Промышленность (каскадный выпадающий список с функциональной областью) // работает хорошо, FunctionalArea // работает хорошо Локатор (несколько мест) , Опыт работы // работаетну

В Контроллере Я получаю эти значения из формы коллекции. Какой тип данных я должен использовать для ключевых слов и местоположения (строка или строка [])?

   public ActionResult SearchResult(FormCollection formCollection)
            {
    IList<Jobs> JobsSearchResultList = new List<Jobs>();
                //string[] keywords = null;            
                string location = null;
                int? industry = 0;
                int? functionaArea = 0;
                int? experience = 0;
                string keywords = null;

                if (formCollection["txtKeyword"] != "")
                {
                    keywords = formCollection["txtKeyword"];
                }
                //if (formCollection["txtKeyword"] != "")
                //{
                //    keywordAry = formCollection["txtKeyword"].Split(' ');
                //    foreach (string keyword in keywordAry)
                //    {
                //        string value = keyword;

                //    }                
                //}
......retrieving other values from formcollection
....

    //Now passing these values to Service method where i have criteria for job search
JobsSearchResultList = oEasyJobsService.GetJobsOnSearchExists(keywords,industry,functionaArea,location,experience);
        return View(JobsSearchResultList);
    }

В Услуги Я сделал как:

public IList<EASYJobs> GetJobsOnSearchExists(string keywords, int? industryId, int? functionalAreaId, string location, int? experience)
{
IList<JobLocation> locationlist = new List<JobLocation>();
IList<Jobs> JobsList = null;
var disjunction = Expression.Disjunction();
ICriteria query = session.CreateCriteria(typeof(Jobs), "EJobs");
if (keywords != null)
        {

        foreach (string keyword in keywords)
        {
        string pattern = String.Format("%{0}%", keyword);
        disjunction
       .Add(Restrictions.InsensitiveLike("Jobs.keywords", pattern,MatchMode.Anywhere))
       .Add(Restrictions.InsensitiveLike("YJobs.PostTitle",pattern,MatchMode.Anywhere));
        }
       query.Add(disjunction)
            .Add(Expression.Eq("EASYJobs.Industry.IndustryId", industryId))
            .Add(Expression.Eq("Jobs.FunctionalArea.FunctionalAreaId", functionalAreaId))
            .Add(Expression.Eq("Jobs.RequiredExperience", experience)));
       }
else
{..
}
JobsList = criteria.List<Jobs>();
}

Проблемы, с которыми я сталкиваюсь:

  1. В контроллере, если я использую строку [], то Split (',') не разделяет строку с указанным разделителем. Она передает строку в том виде, как она есть в Service.

2. В службах iя пытаюсь заменить строку на% {0}%, строки с пробелами заменяются / concat () здесь с указанным разделителем.Но проблема здесь в том, что всегда возвращать весь список заданий, значит не давать требуемый вывод.Пожалуйста, помогите ...

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Пока у вас есть разделитель, вы можете разбить входные данные на части, чтобы иметь возможность создавать выражения или с частями.Вы можете использовать дизъюнкцию для объединения произвольного числа критериев, используя OR.

var criteria = session.CreateCriteria<TestObject>();
Junction disjunction = Restrictions.Disjunction();

var input = "key words";
foreach (var keyword in input.Split(" "))
{
    ICriterion criterion = Restrictions.Eq("PropertyName", keyword);
    disjunction.Add(criterion);
}
criteria.Add(disjunction);
0 голосов
/ 02 апреля 2012

Несколько ключевых слов со специальными символами или лишними пробелами заменяются одним пробелом с выражениями Regex.И тогда ключевые слова разделяются сплитом ("").Работает как требуется ....

if (!string.IsNullOrEmpty(keywords))
                {
                    keywords = keywords.Trim();
                    keywords = System.Text.RegularExpressions.Regex.Replace(keywords, @"[^0-9a-zA-Z\._\s]", " ");
                    keywords = System.Text.RegularExpressions.Regex.Replace(keywords, @"[\s]+", " "); 

                    if (keywords.IndexOf(" ") > 0)
                    {
                        string[] arr = keywords.Split(" ".ToCharArray());
                        for (int i = 0; i < arr.Length; i++)
                        {
                            if (!string.IsNullOrEmpty(arr[i]))
                            {
                                criteria.Add(Restrictions.Disjunction()
                                 .Add(Expression.Like("EASYJobs.keywords", arr[i], MatchMode.Anywhere)));
                            }
                        }
                    }
                    else
                    {
                        criteria.Add(Restrictions.Disjunction()                      
                             .Add(Expression.Like("EASYJobs.keywords", keywords, MatchMode.Anywhere)));
                    }

                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...