我有一个linq到sql数据库。非常简化,我们有3个表,项目和用户。有一个名为User_Projects的连接表将它们连接在一起。
我已经有了一种为给定用户获取IEnumberable<Project>
的工作方法。
from up in User_Projects
select up.Project;
现在我想获取用户不所涉及的项目。我认为IEnumerable的except方法在这里会很不错:
return db.Projects.Except(GetProjects());
编译,但是我得到一个运行时错误:“除了Contains()运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现。”
有没有办法解决这个问题?
一些观点但没有答案:p
我试过这个:
IEnumerable<Project> allProjects = db.Projects;
IEnumerable<Project> userProjects = GetProjects();
return allProjects.Except(GetProjects());
我知道它与原始语句基本相同 - 但现在我没有遇到运行时错误。不幸的是,它并没有真正做除了部分而只是返回所有项目,出于某种原因
答案 0 :(得分:6)
Linq to Sql不了解如何使用任意内存中的对象序列。您需要以关系术语表达这一点,这些术语适用于ID:
var userProjectIds =
from project in GetProjects()
select project.ProjectId;
var nonUserProjects =
from project in db.Projects
where !userProjectIds.Contains(project.ProjectId)
select project;
答案 1 :(得分:3)
您可以尝试像
这样简单的事情User u = SomeUser;
from up in User_Projects
where up.User != u
select up.Project;
答案 2 :(得分:0)
试试这个:
var userProjects = GetProjects();
return db.Projects.Except(userProjects.ToArray());
ToArray应强制评估序列(如果我正确理解问题)并允许操作成功。