Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IEnumerable.Except wont work, so what do I do?

Tags:

c#

linq

I have a linq to sql database. Very simplified we have 3 tables, Projects and Users. There is a joining table called User_Projects which joins them together.

I already have a working method of getting IEnumberable<Project> for a given user.

from up in User_Projects
select up.Project;

Now I want to get the projects the user isn't involved with. I figured the except method of IEnumerable would be pretty good here:

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

That compiles, however I get a runtime error: "Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator."

Is there any way to get around this?


Update:

A few views but no answers :p

I have tried this:

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

I know it's essentially the same as the original statement - but now i dont get a runtime error. Unfortunately, it doesn't really do the except part and just returns all the projects, for some reason

like image 729
Chris James Avatar asked Jan 24 '23 23:01

Chris James


1 Answers

Linq to Sql doesn't understand how to work with an arbitrary in-memory sequence of objects. You need to express this in relational terms, which works on IDs:

var userProjectIds =
    from project in GetProjects()
    select project.ProjectId;

var nonUserProjects =
    from project in db.Projects
    where !userProjectIds.Contains(project.ProjectId)
    select project;
like image 127
Bryan Watts Avatar answered Feb 08 '23 14:02

Bryan Watts