LINQ - EF加入难度

时间:2012-12-10 22:13:15

标签: asp.net linq entity-framework

我有两张桌子:

阶段:

long ID
string Name

和另一个活动:

long ID
string Name
long PhaseID

我已经知道阶段的名称,我想获得这些特定阶段的活动。我是否将PhaseName添加到活动表中,还是通过LINQ中的连接来实现?

也许是这样的?

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

...在这里我不知道如何完成这个查询..

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您提供的代码将使用Inner Join查找存在名称“预先计划”的阶段的所有活动。
要完成查询,您需要添加一个select子句。

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   

将返回所有活动名称的IEnumerable<string>

答案 1 :(得分:2)

只需根据需要选择活动:

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

以下是query expression的样子:

查询表达式必须以来自子句开头,并且必须以选择子句结束。在第一个from子句和最后一个select或group子句之间,它可以包含一个或多个这些可选子句:where,orderby,join,let甚至是from子句。您还可以使用into关键字将join或group子句的结果作为同一查询表达式中其他查询子句的源。

与令人费解的图像相同:

enter image description here

使用方法语法,您无需使用特殊内容结束查询:

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

答案 2 :(得分:1)

如果您只需要其中一个表中的数据,则无需进行连接。您可以改为使用过滤器:

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