Создайте запрос linq на основе определенных критериев c # - PullRequest
0 голосов
/ 06 июля 2011

У меня есть список ListPeople "список людей с именем ListPeople" и класс для объекта People:

class People
{
   public string Name {get;set;}
   public DateTime Dob {get;set;}
   public int Wieght {get;set;}
}

Как выполнить поиск по критериям, выбранным пользователем: что-то вроде: enter image description here

например, если пользователь выберет что-то вроде: enter image description here

Тогда я бы знал, как настроить этот запрос:

var query = (from a in ListPeople
             where a.Name == "Tom" &&
             a.Weight > 25 &&
             a.Dob < "dateTime.Now() - 7 months" // you know what I mean
             select a).ToList();

нужно ли мнепостроить 4 * 4 * 4 (все возможные комбинации) количество запросов?

Ответы [ 3 ]

4 голосов
/ 06 июля 2011

Вам не нужно заранее составлять все возможные комбинации, вам просто нужна способность продолжать строить запрос. Черновик:

var myQuery = ListPeople.AsEnumerable();

if (name.Selection == "Is")
    myQuery = myQuery.Where(p => p.Name == nameInput.Text);
else if (name.Selection == /* continues */

Вы можете продолжить делать это для каждого из ваших элементов пользовательского интерфейса, чтобы построить соответствующие предикаты для вашего запроса, а затем, после того, как вы закончите, оцените его как нормальное.

Вы можете сделать то же самое для Linq-to-SQL или EF, вы просто хотите использовать AsQueryable() вместо AsEnumerable(), чтобы вы могли завершить запрос перед отправкой его в базу данных.

var myQuery = context.People.AsQueryable();
// continues
1 голос
/ 06 июля 2011

Чтобы сделать это с помощью LINQ, вам нужно извлечь все данные, а затем написать отдельные предложения where, чтобы отфильтровать то, что вам нужно. Вы должны передать все переменные в функцию в виде строки, чтобы вы могли легко определить, что пусто. Эту функцию вы бы настроили:

public List<ListPeople> GetPeopleList(string Name, string opName, string Weight, string opWeight, string DOB, string opDOB)
{
     var items = from a in ListPeople
                 select a;

     //--- repeat the section below for Weight and DOB
     if (!string.IsNullOrEmpty(Name))
     {
          switch(opName.ToLower())
          {
               case "contains":
               {
                   items = items.Where(a => SqlMethods.Like(a.Name, "%" + Name + "%"));
                   break;    
               }
               case "does not contain":
               {
                   items = items.Where(a => !SqlMethods.Like(a.Name, "%" + Name + "%"));
                   break;    
               }
               case "is":
               {
                   items = items.Where(a => a.Name == Name));
                   break;    
               }
               case "is not":
               {
                   items = items.Where(a => a.Name != Name));
                   break;    
               }
          }
     } 
     //--- end repeat

     return items.ToList();
}

Удачи!

EDIT: Так как мой ответ здесь, я нашел лучший способ сделать эти типы запросов, и это значительно повысит производительность. Оформить заказ http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx Этот класс позволяет динамически создавать запрос LINQ в строковом формате и затем передавать его в запрос. Вот пример того, как я использовал его на веб-сайте недвижимости для функции поиска недвижимости (уменьшен для простоты):

public IQueryable GetSearchResults(string PriceFrom, string PriceTo, string Beds, string Baths, string SqftFrom, string SqftTo, string YearFrom, string YearTo)
{
    DatabaseDataContext db = new DatabaseDataContext();

    string WhereClause = string.Empty;

    if (!string.IsNullOrEmpty(PriceFrom))
        WhereClause = "ListPrice >= " + PriceFrom + " AND ";

    if (!string.IsNullOrEmpty(PriceTo))
        WhereClause += "ListPrice <= " + PriceTo + " AND ";

    if (!string.IsNullOrEmpty(Beds))
        WhereClause += "Beds >= " + Beds + " AND ";

    if (!string.IsNullOrEmpty(Baths))
        WhereClause += "FullBaths >= " + Baths + " AND ";

    if (!string.IsNullOrEmpty(SqftFrom))
        WhereClause += "SqFtHeated >= " + SqftFrom + " AND ";

    if (!string.IsNullOrEmpty(SqftTo))
        WhereClause += "SqFtHeated <= " + SqftTo + " AND ";

    if (!string.IsNullOrEmpty(YearFrom))
        WhereClause += "YearBuilt >= " + YearFrom + " AND ";

    if (!string.IsNullOrEmpty(YearTo))
        WhereClause += "YearBuilt <= " + YearTo + " AND ";

    if (WhereClause.EndsWith(" AND "))
        WhereClause = WhereClause.Remove(WhereClause.Length - 5);

    IQueryable query = db.Listings
                .Where(WhereClause)
                .OrderBy("ListPrice descending");

    return query;
}

Удачи!

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