C# 如何将以下Linq查询压缩为一个IQueryable

C# 如何将以下Linq查询压缩为一个IQueryable,c#,linq,entity-framework,iqueryable,C#,Linq,Entity Framework,Iqueryable,我有一个EntityFramework模型,它有一个用户实体,该用户实体有一个组织的EntityCollection 对于一个特定的用户,我试图编写一个Linq查询来返回该用户所属的组织的名称,该查询只会在数据库中出现一次 我的问题是,如果不先实现用户,然后查询用户组织集合,我就看不到如何编写此查询 我想尝试编写一个查询,一次命中数据库 到目前为止,我所拥有的: var orgNames = context.Users .Where(u => u.LoweredUserName =

我有一个EntityFramework模型,它有一个用户实体,该用户实体有一个组织的EntityCollection

对于一个特定的用户,我试图编写一个Linq查询来返回该用户所属的组织的名称,该查询只会在数据库中出现一次

我的问题是,如果不先实现用户,然后查询用户组织集合,我就看不到如何编写此查询

我想尝试编写一个查询,一次命中数据库

到目前为止,我所拥有的:

var orgNames = context.Users
    .Where(u => u.LoweredUserName == userName.ToLower())
    //materialises user
    .FirstOrDefault()
    .Organisations
    //second hit to the db
    .Select(o => o.Name);
我的目标是什么,但我看不见树林:

orgNames = context.Users
    .Where(u => u.LoweredUserName == userName.ToLower())
    //don't materialise but leave as IQueryable
    .Take(1)
    //The problem: turn what the query sees as possibly multiple
    // (due to the Take method) EntityCollection<Organisation> into a List<String>
    .Select(u => u.Organisations.Select(o => o.Name));
orgNames=context.Users
.Where(u=>u.LoweredUserName==userName.ToLower())
//不要成为现实,但要尽可能地离开
.采取(1)
//问题是:将查询看到的内容转换为可能的多个
//(由于Take方法)将EntityCollection合并到列表中
.Select(u=>u.organizations.Select(o=>o.Name));

我已经看了总量,但我似乎在兜圈子:)

Doh!我想我可以通过使用SelectMany将集合压缩为一个集合来回答我自己的问题,如下所示:

orgNames = context.Users.Where(u => u.LoweredUserName == userName.ToLower())
                .Take(1)
                .SelectMany(u => u.Organisations)
                .Select(o => o.Name);

我假设降低的用户名是唯一的,否则查询将毫无意义,所以您可以使用

context.Users
       .Where(u => u.LoweredUserName == userName.ToLower())
       .Select(u => u.Organisations.Select(o => o.Name));