2009-10-28 6 views
2

이 문제를 해결하는 데 어려움을 겪고 있습니다. C#, asp.net에서 동적 linq 쿼리를 작성하는 코드가 필요합니다. 같은 데이터베이스 테이블에서 다른 열을 검색하고 항목을 필터링 한 값을 단일 목록 상자로 반환하는 5 개의 드롭 다운 목록이 있습니다. 문제는 DDL에서 어느 하나 또는 모두가 선택되지만 조합 된 필터링 결과가 목록 상자에 나타나야한다는 시퀀스가 ​​없다는 것입니다. 각 DDL 선택을 한 번에 한 열씩 검색하고 결과를 반환하는 작업 쿼리가 있습니다. AND를 사용하여 where 절을 추가해야이 쿼리에 다른 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

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

+0

어떻게이 쿼리를 동적으로 만들어 각 DDL 선택 항목을 추가 할 수 있습니까?이 코드로 도와주세요. DataTable의 결과 = (((데이터 세트) _MyDataset) .Tables [ "기록"]에서의 D. AsEnumerable() d.Field ("이름") ORDERBY 오름차순 곳 (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

이 이 가 null이 아니라면 우리는 단지 우리의 기준에 할당 된 널 (null) 값을 확인

는, 객체 다음 우리가 추가

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 함수를 클래스 파일에 복사하고 모든 라인에서 구문 오류를 받고. 내가 놓친 게 있니? 코드에서이 함수를 어떻게 호출합니까? – menon

+0

내 경우에는 linq 쿼리에 의해 검색되는 _MyDataset이 있는데, 어떻게 사용합니까? (var ctx = ContextManager .GetManager (Database.ApplicationConnection, false)) – menon

+0

여기 내 쿼리는 대신 사용합니다. : 어떻게 UR 코드에 추가 할 수 있습니까? DataTable의 결과 = (((데이터 세트) _MyDataset) .Tables [ "기록"]에서의 D. AsEnumerable() d.Field ("이름") ORDERBY 오름차순 곳 (d.Field (COLUMNNAME)! = NULL) 여기서 d [columnName] .ToString(). ToLower(). 포함 (searchstr.ToLower()) 선택 d) .CopyToDataTable(); – menon