实体框架 - 使用动态查询的TOP

时间:2012-04-28 08:51:06

标签: entity-framework linq-to-entities

在构建新的对象查询时,我遇到了实现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的记录。 (这是用户搜索屏幕)

2 个答案:

答案 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)