抛出错误的paginatedlist“除了Contains运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现。”

时间:2011-04-10 04:00:11

标签: asp.net-mvc linq iqueryable

我看过这里: LINQ To SQL exception: Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains operator

在这里: LINQ to Populate a range

但我无法想出这个。我已将我的任务管理器基于NerdDinner项目。我有一个方法,而不是FindUpcommingDinners:

    Public Function FindAllTeamTasks(ByVal TeamRole As String) As IQueryable(Of Task) Implements ITaskRepository.FindAllTeamTasks

        Return From task In db.Tasks
               Join usrs In System.Web.Security.Roles.GetUsersInRole(TeamRole)
               On task.TaskAssignedToID Equals usrs
               Order By task.InsertDateTime _
               Select task
    End Function

当结果作为源传递到Paginatedlist时,它会出现“Local sequence not not ...”错误。答案可能也在这里,但我无法弄清楚。请帮忙。

ASP.NET MVC2 LINQ - Repository pattern, where should the pagination code go?

2 个答案:

答案 0 :(得分:0)

您不能通过LINQ to SQL在数据库表的连接中使用GetUsersInRole()的结果。你可以试试这个:

  Dim usrs = System.Web.Security.Roles.GetUsersInRole(TeamRole)

  Return From task In db.Tasks                      _
         Where usrs.Contains(task.TaskAssignedToID) _
         Order By task.InsertDateTime               _
         Select task

答案 1 :(得分:0)

每当您使用Linq to SQL时,您的查询必须能够转换为SQL以针对您的数据库运行。 Linq to SQL的Linq提供程序只知道如何在数据库外部发生的非常特定的操作中执行此操作。因此,例如,Linq to SQL不知道如何处理

Join usrs In System.Web.Security.Roles.GetUsersInRole(TeamRole)

因为GetUsersInRole不是(就Linq而言)数据库中的一个表,而是应用程序中的一个集合。

正如错误消息所提到的那样,有一个“异常”,在某些情况下,Linq to SQL确实知道如何处理Contains(通过在SQL中将其转换为IN,如果我记得的话)不驻留在数据库中的集合。考虑到这一点,你可能会把你的查询变成类似的东西(对不起,这是在C#,但我希望你能翻译):

string[] users = System.Web.Security.Roles.GetUsersInRole(TeamRole);

return db.Tasks
         .Where<Task>(t => users.Contains<string>(t.TaskAssignedToID))
         .OrderBy<Task, DateTime>(t => t.InsertDateTime)
         .AsQueryable<Task>();

现在,如果您的加入是因为TaskAssignedToID是一个集合而不仅仅是一个字符串(我不熟悉您正在使用的模型,抱歉),您可能需要执行类似< / p>

string[] users = System.Web.Security.Roles.GetUsersInRole(TeamRole);

return db.Tasks
         .Where<Task>(t => t.TasksAssignedToID.Any<string>(i => users.Contains<string>(i)))
         .OrderBy<Task, DateTime>(t => t.InsertDateTime)
         .AsQueryable<Task>();

我不是百分之百确定Linq to SQL对Any是好的 - 我主要使用Linq to Entities - 但我希望这是有道理的。