但我无法想出这个。我已将我的任务管理器基于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?
答案 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 - 但我希望这是有道理的。