2009-10-28 4 views
2

Мне сложно решить эту проблему, нужен код для создания динамического запроса linq на C#, asp.net. У меня есть 5 раскрывающихся списков, которые ищут разные столбцы в одной таблице базы данных и возвращают элемент в отдельном списке. Проблема в том, что в DDL нет последовательности, которая или все или любые будут выбраны, но объединенный отфильтрованный результат должен появиться в списке. У меня есть рабочий запрос, который ищет и возвращает результат в одном столбце за раз для каждого выбора DDL отдельно. Нужно добавить, где предложения с И, чтобы добавить другие варианты DDL динамически к этому запросу. БлагодаряЗапрос LinQ - Добавить где динамически


public ListItemCollection searchProject(ListItemCollection projList, String searchstr, String columnName) 
{ 
    DataSet DSToReturn = new DataSet(); 

    ListItemCollection returnItems = new ListItemCollection(); 
    DataTable results = (from d in ((DataSet)_MyDataset).Tables["Records"].AsEnumerable() 
         orderby d.Field<string>("Name") ascending 
         where (d.Field<string>(columnName) != null) 
         where d[columnName].ToString().ToLower().Contains(searchstr.ToLower()) 
         select d).CopyToDataTable(); 

    foreach (ListItem li in projList) 
    { 
     if ((from System.Data.DataRow row in results.Rows 
      where li.Value.Equals(row["value"].ToString(), StringComparison.InvariantCultureIgnoreCase) 
      select row["value"]).Count() > 0) 
     returnItems.Add(li); 
    } 

    return returnItems; 
} 
+0

duplicate http://stackoverflow.com/questions/848415/linq-dynamic-where-clause –

+0

Как я могу сделать этот запрос динамическим, чтобы добавить, где с каждым выбором DDL, пожалуйста, помогите мне с этим кодом. DataTable результатов = (от г в ((DataSet) _MyDataset) .tables [ "Records"]. AsEnumerable() OrderBy d.Field ("Name") восходящая где (d.Field (ColumnName)! = NULL) где d [columnName] .ToString(). ToLower(). Содержит (searchstr.ToLower()) выберите d) .CopyToDataTable(); – menon

+0

Возможный дубликат операторов [Linq2SQL "и/или" (условия ANDed/ORed)] (http://stackoverflow.com/questions/1450983/linq2sql-or-and-operators-anded-ored-conditions) –

ответ

7

Вот пример кода для того, как мы это делаем ...

private void DataPortal_Fetch(GoalCriteria criteria) 
    { 
     using (var ctx = ContextManager<Data.ExodusDataContext> 
        .GetManager(Database.ApplicationConnection, false)) 
     { 
      this.RaiseListChangedEvents = false; 
      this.IsReadOnly = false; 

      // set option to eager load child object(s) 
      var opts = new System.Data.Linq.DataLoadOptions(); 
      opts.LoadWith<Data.Goal>(row => row.Contact); 
      opts.LoadWith<Data.Goal>(row => row.Sales); 
      opts.LoadWith<Data.Goal>(row => row.Customer); 
      ctx.DataContext.LoadOptions = opts; 

      IQueryable<Data.Goal> query = ctx.DataContext.Goals; 

      if (criteria.Name != null) // Name 
       query = query.Where(row => row.Name.Contains(criteria.Name)); 

      if (criteria.SalesId != null) // SalesId 
       query = query.Where(row => row.SalesId == criteria.SalesId); 

      if (criteria.Status != null) // Status 
       query = query.Where(row => row.Status == (int)criteria.Status); 

      if (criteria.Statuses.Count != 0) // Statuses 
       query = query.Where(row => criteria.Statuses.Contains((GoalStatus)row.Status)); 

      if (criteria.ContactId != null) // ContactId 
       query = query.Where(row => row.ContactId == criteria.ContactId); 

      if (criteria.CustomerId != null) // CustomerId 
       query = query.Where(row => row.CustomerId == criteria.CustomerId); 

      if (criteria.ScheduledDate.DateFrom != DateTime.MinValue) // ScheduledDate 
       query = query.Where(t => t.ScheduledDate >= criteria.ScheduledDate.DateFrom); 
      if (criteria.ScheduledDate.DateTo != DateTime.MaxValue) 
       query = query.Where(t => t.ScheduledDate <= criteria.ScheduledDate.DateTo); 

      if (criteria.CompletedDate.DateFrom != DateTime.MinValue) // ComplatedDate 
       query = query.Where(t => t.CompletedDate >= criteria.CompletedDate.DateFrom); 
      if (criteria.CompletedDate.DateTo != DateTime.MaxValue) 
       query = query.Where(t => t.CompletedDate <= criteria.CompletedDate.DateTo); 

      if (criteria.MaximumRecords != null) // MaximumRecords 
       query = query.Take(criteria.MaximumRecords.Value); 

      var data = query.Select(row => GoalInfo.FetchGoalInfo(row)); 

      this.AddRange(data); 

      this.IsReadOnly = true; 
      this.RaiseListChangedEvents = true; 
     } 
    } 

Мы просто проверить нулевое значение, присвоенное нашим критериям объекта, если это не нуль, то мы добавляем это к запросу.

+0

Я абсолютно новый, пожалуйста, помогите, я скопировал всю функцию Dataportal_Fetch в файле Class и получил синтаксическую ошибку в каждой строке. Я что-то пропустил? и как мне вызвать эту функцию в коде? – menon

+0

В моем случае у меня есть _MyDataset, который выполняется поиском по linq Query, как использовать это вместо , используя (var ctx = ContextManager .GetManager (Database.ApplicationConnection, false)) – menon

+0

вот мой запрос : как я могу добавить его в код ur? DataTable результатов = (от г в ((DataSet) _MyDataset) .tables [ "Records"]. AsEnumerable() OrderBy d.Field ("Name") восходящая где (d.Field (ColumnName)! = NULL) где d [columnName] .ToString(). ToLower(). Содержит (searchstr.ToLower()) выберите d) .CopyToDataTable(); – menon

Смежные вопросы