简体   繁体   中英

LINQ - EF join difficulty

I have two tables:

Phase :

long ID
string Name

and another Activity :

long ID
string Name
long PhaseID

I already know the name of the phases and I want to get the activity for those particular phases. Do i add PhaseName to the activity table or do I do it through join in LINQ?

Maybe something like this?

var query = from a in entities.Activities
                        join p in entities.Phases on a.PhaseId equals p.Id
                        where p.Name == "Preplanning"

... and here im not sure how to finish this query..

Thanks for your help!

The code that you've provided will use an Inner Join to find all Activities where the Phase with Name "Preplanning" exists.
To finish your query you need to add a select clause.

var query = from a in entities.Activities
                 join p in entities.Phases on a.PhaseId equals p.Id
                 where p.Name == "Preplanning"
                 select a.Name   

will return IEnumerable<string> of all activity names.

Just select activity, as you want:

var query = from a in entities.Activities
            join p in entities.Phases on a.PhaseId equals p.Id
            where p.Name == "Preplanning"
            select a;

Here is how query expression should look like:

A query expression must begin with a from clause and must end with a select or group clause. Between the first from clause and the last select or group clause, it can contain one or more of these optional clauses: where, orderby, join, let and even additional from clauses. You can also use the into keyword to enable the result of a join or group clause to serve as the source for additional query clauses in the same query expression.

Same as puzzling image:

在此处输入图片说明

With method syntax you don't need to end query with something special:

var query = entities.Phases
               .Where(p => p.Name == "Preplanning")
               .Join(entities.Activities, p => p.Id, a => a.PhaseId, (p,a) => a);

No need to do a join if you only need data from one of the tables. You can apply a filter instead:

var q = entities.Activities.Where(a => 
        entities.Phases.Any(p => a.PhaseId == p.Id && p.Name == "Preplanning"));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM