在构建新的对象查询时,我遇到了实现TOP或SKIP功能的问题。
我不能使用eSQL,因为我需要使用“IN”命令 - 如果我循环IN并将它们全部添加为“OR”参数,这可能会变得非常复杂。
代码如下:
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()
如果我使用任何形式的.Top或.Skip,则会抛出错误:LINQ to Entities查询不支持查询构建器方法
有没有办法使用这种方法指定TOP或Limit?如果可能的话,我想避免查询返回1000的记录。 (这是用户搜索屏幕)
答案 0 :(得分: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中,这可能会更好地传达有关它出错的原因。
答案 1 :(得分:0)
将这一点标记为混乱。我应该使用.Take而不是.Top或.Limit或其他任何东西。
我的最后一部分如下所示:
grdResults = r.Take(100)