我认识到这个问题以前曾以各种形式提出过,但我读过的这些问题都没有给我提供我需要的东西。
问题:鉴于下面的模型,并且只知道客户端ID,我如何获得一个List,其中包含允许客户端执行的每个活动的Uid?
我从代码开始,如下面的代码,但不知道从那里去哪里。我认为它与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>();
}
答案 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();
}