0

我有两张桌子:

阶段 :

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"

...在这里我不确定如何完成此查询..

谢谢你的帮助!

4

3 回答 3

2

您提供的代码将使用Inner Join查找名称为“Preplanning”的阶段所在的所有活动。
要完成您的查询,您需要添加一个选择子句。

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>所有活动名称。

于 2012-12-10T22:17:09.433 回答
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;

以下是查询表达式的外观:

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

与令人费解的图像相同:

在此处输入图像描述

使用方法语法,您不需要以特殊的方式结束查询:

var query = entities.Phases
               .Where(p => p.Name == "Preplanning")
               .Join(entities.Activities, p => p.Id, a => a.PhaseId, (p,a) => a);
于 2012-12-10T22:17:13.397 回答
1

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

var q = entities.Activities.Where(a => 
        entities.Phases.Any(p => a.PhaseId == p.Id && p.Name == "Preplanning"));
于 2012-12-10T22:20:40.387 回答