【问题标题】:IEnumerable.Except wont work, so what do I do?IEnumerable.Except 不起作用,那我该怎么办?
【发布时间】:2008-12-01 16:29:38
【问题描述】:

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

我已经有了为给定用户获取IEnumberable<Project> 的工作方法。

from up in User_Projects
select up.Project;

现在我想获取用户参与的项目。我认为 IEnumerable 的 except 方法在这里会很好:

return db.Projects.Except(GetProjects());

编译成功,但是我得到一个运行时错误:“本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains() 运算符除外。”

有没有办法解决这个问题?


更新:

一些观点但没有答案:p

我试过这个:

        IEnumerable<Project> allProjects = db.Projects;
        IEnumerable<Project> userProjects = GetProjects();
        return allProjects.Except(GetProjects());

我知道它与原始语句基本相同 - 但现在我没有收到运行时错误。不幸的是,由于某种原因,它并没有真正做除了部分,只是返回所有项目

【问题讨论】:

  • 我编辑了我的答案,包括快速解释为什么你必须这样做。

标签: c# linq


【解决方案1】:

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;

【讨论】:

  • 是的,它做到了,但是 except() 没有工作真是太糟糕了:(
  • @Bryan Watts,您刚刚通过声明“Linq to Sql 不了解如何处理任意内存中的对象序列”大大改变了我的生活质量。谢谢
  • @UB3571:这真是一种恭维。谢谢!
【解决方案2】:

你可以尝试一些简单的东西,比如

User u = SomeUser;

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

【讨论】:

  • FAR 更好,但它需要一个独特的。
【解决方案3】:

试试这个:

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

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

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多