2012-04-28 3 views
0

새 개체 쿼리를 작성할 때 TOP 또는 SKIP 기능을 구현하는 데 문제가 있습니다.Entity Framework - 동적 쿼리를 사용하는 TOP

"IN"명령을 사용해야하기 때문에 eSQL을 사용할 수 없습니다. IN을 반복하여 "OR"매개 변수로 추가하면 상당히 복잡해질 수 있습니다. 내가 .Top의 양식을 사용하거나 .Skip 경우

Using dbcontext As New DB 

     Dim r As New ObjectQuery(Of recipient)("recipients", dbcontext) 
     r.Include("jobs") 
     r.Include("applications") 

     r = r.Where(Function(w) searchAppIds.Contains(w.job.application_id)) 

     If Not statuses.Count = 0 Then 
      r = r.Where(Function(w) statuses.Contains(w.status)) 
     End If 

      If Not dtFrom.DbSelectedDate Is Nothing Then 
       r = r.Where(Function(w) w.job.create_time >= dtDocFrom.DbSelectedDate) 

      End If 

      If Not dtTo.DbSelectedDate Is Nothing Then 
       r = r.Where(Function(w) w.job.create_time <= dtDocTo.DbSelectedDate) 

      End If 

      'a lot more IF conditions to add in additional predicates 

      grdResults.DataSource = r 

     grdResults.DataBind()    

오류가 발생합니다 :

코드는 다음과 같습니다 쿼리 빌더 방법은 엔티티에 LINQ 지원되지 않습니다

어떤 방법이 쿼리 이 방법을 사용하여 TOP 또는 Limit를 지정 하시겠습니까? 가능한 경우 1000 개의 레코드를 반환하는 쿼리를 피하고 싶습니다. (그것은 사용자 검색 화면입니다)

답변

1

r = new ObjectQuery<recipient>("recipients", dbContext)

보다는

r = dbContext.recipients을 시도합니다.

.Skip().Take() 반환 IOrderedQueriable<T>.Where 동안 반환 IQueriable<T>. 따라서 .Skip().Take()을 마지막에 넣으십시오.

grdResults.DataSource = r에서 grdResults.DataSource = r.ToList()으로 변경하여 지금 쿼리를 실행하십시오. 또한이 줄을 try/catch에 임시로 래핑 할 수 있으므로 오류가 발생하는 이유에 대한 더 나은 메시지가 노출 될 수 있습니다.

0

혼란 스럽습니다. 나는 .Top이나 .Limit 또는 .Take 대신에 .Take를 사용 했어야했다.

내 마지막 부분은 아래이며, 그것을 작동 :

grdResults = r.Take(100) 
관련 문제