0

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

4

2 回答 2

1

而不是

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

尝试

r = dbContext.recipients.

.Skip()并在.Take()返回IOrderedQueriable<T>.Where返回IQueriable<T>。因此把.Skip()and放在.Take()最后。

也改为grdResults.DataSource = r现在grdResults.DataSource = r.ToList()执行查询。这也将允许您将这一行暂时包装在 try/catch 中,这可能会更好地显示关于它为什么出错的消息。

于 2012-04-28T09:05:54.003 回答
0

将此标记为混乱。我应该一直使用 .Take 而不是 .Top 或 .Limit 或任何东西。

我的最后一部分如下,它有效:

grdResults = r.Take(100)
于 2012-04-29T09:34:28.177 回答