【问题标题】:paginatedlist throwing an error "Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator."分页列表抛出错误“本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但包含运算符除外。”
【发布时间】:2011-04-10 04:00:10
【问题描述】:

我看过这里: 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

当结果作为源传递到分页列表时,会出现“本地序列无法...”错误。答案可能也在这里,但我无法弄清楚。请帮忙。

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

【问题讨论】:

  • 我已将您未注册的帐户与您的注册帐户合并。您现在可以接受您想要接受的答案。

标签: asp.net-mvc linq iqueryable


【解决方案1】:

您不能在通过 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

【讨论】:

    【解决方案2】:

    每当您使用 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 确实知道如何处理包含(如果我记得的话,通过在 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 是一个集合而不仅仅是一个字符串(我不熟悉你使用的模型,抱歉),你可能需要做类似的事情

    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>();
    

    我不能 100% 确定 Linq to SQL 是否适用于 Any ——我主要使用 Linq to Entities ——但我希望这是有道理的。

    【讨论】:

    • 应该是“task.TaskAssignedToID”(没有“s”)并且不是可枚举的(不能使用“Any()”)。
    猜你喜欢
    • 2012-12-06
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多