实体框架,基于包含从相关表中获取元素

时间:2014-05-01 20:25:35

标签: c# linq entity-framework

我认识到这个问题以前曾以各种形式提出过,但我读过的这些问题都没有给我提供我需要的东西。

问题:鉴于下面的模型,并且只知道客户端ID,我如何获得一个List,其中包含允许客户端执行的每个活动的Uid?

EF Model

我从代码开始,如下面的代码,但不知道从那里去哪里。我认为它与select语句有关 - 但我对LINQ的无知让我感到压力:)

public List<string> GetClientAndPermittedActivities ( int clientId )
{
    var permittedActivities = ReadAllRaw()
        .Where(c => c.Id == clientId)
        .Include("ClientType")
        .Include("Role")
        .Include("PermittedActivities")
        .Include("Activities");


}

internal IQueryable<TE> ReadAllRaw ()
{
    return base.ReadAll();
}

// READ (ALL)
internal IQueryable<T> ReadAll ()
{
    return DbSet;
}

private void SetContext ( DbContext context )
{
    this.Context = context;
    this.DbSet = Context.Set<T>();
}

3 个答案:

答案 0 :(得分:2)

你可以直接链接&#39;您的navigation properties一起包括在内。

public List<string> GetClientAndPermittedActivities(int clientId)
{
    var permittedActivities =
        ReadAllRaw()
            .Include("ClientType.Role.PermittedActivities")
            .Where(c => c.Id == clientId)
            .ToList();
}

那应该得到你所有的PermittedActivities

修改

如果你添加

using System.Data.Entity;

到你的班级,你可以使用lambdas来创建你的陈述。

public List<string> GetClientAndPermittedActivities(int clientId)
{
    var permittedActivities =
        ReadAllRaw().Include(x => c.ClientType.Role.PermittedActivities.SelectMany(pa => pa.Activities.Uid))
            .Where(c => c.Id == clientId)
            .ToList();
}

通过此操作,您会收到所请求的Activity.Uid

答案 1 :(得分:1)

应该像

from c in Client
where c.ClientId = clientId
from p in c.ClientType.Role.PermittedActivities
select p.Activity.Uid

如您所见,您只需从Client开始,然后按照关联进行操作:n - 1由点.表示,1 - n由新from表示声明。

这称为查询语法或综合语法。大多数情况下,这会产生比简洁语法(Client.Where(c => ...)更简洁的代码,尽管有些事情你只能对后者做。

答案 2 :(得分:1)

您的方法可能如下所示:

public List<string> GetClientAndPermittedActivities(int clientId)
{
    return ReadAllRaw()
            .Where(c => c.Id == clientId)
            .SelectMany(
                           ct => ct.ClientType
                                   .Role
                                   .PermittedActivities,
                           (s, c) => c.Uid
                       )
            .ToList();
}