C# 我数不清。除了不起作用,我该怎么办?

C# 我数不清。除了不起作用,我该怎么办?,c#,linq,C#,Linq,我有一个linq到sql数据库。非常简单,我们有3个表、项目和用户。有一个称为User_Projects的连接表,将它们连接在一起 我已经有了一种为给定用户获取IEnumerable的工作方法 from up in User_Projects select up.Project; 现在我想得到用户不参与的项目。我认为IEnumerable的except方法在这里会很好: return db.Projects.Except(GetProjects()); 但我得到一个运行时错误:“除了Cont

我有一个linq到sql数据库。非常简单,我们有3个表、项目和用户。有一个称为User_Projects的连接表,将它们连接在一起

我已经有了一种为给定用户获取
IEnumerable
的工作方法

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());
IEnumerable allProjects=db.Projects;
IEnumerable userProjects=GetProjects();
返回除(GetProjects())之外的所有项目;
我知道它本质上与原始语句相同,但现在我没有得到运行时错误。不幸的是,它并没有真正执行except部分,只是返回所有项目,出于某种原因,请尝试以下操作:

var userProjects = GetProjects();
return db.Projects.Except(userProjects.ToArray());

ToArray应该强制对序列进行求值(如果我理解正确的话),并允许操作成功。

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;

你可以尝试一些简单的方法,比如

User u = SomeUser;

from up in User_Projects
where up.User != u
select up.Project;

是的,这就做到了,但是除了()不起作用,这真是太差劲了:(@Bryan Watts,你刚刚用“Linq to Sql不理解如何处理任意内存中的对象序列”这句话显著地改变了我的生活质量感谢you@UB3571:这真是一种恭维。谢谢!我编辑了我的答案,以便快速解释为什么你必须这样做。好得多,但需要一个明确的答案。