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

时间:2010-10-18 22:51:16

标签: c# linq entity-framework iqueryable

我有一个EntityFramework模型,其中包含具有EntityCollection of Organizations的User实体。

对于特定用户,我正在尝试编写一个Linq查询,以返回该用户所属组织的名称,该查询只会在数据库中命中一次。

我的问题是,我无法看到如何编写此查询,而无需首先实现用户,然后查询用户组织集合。

我想尝试编写一个命中db的查询。

到目前为止我所拥有的:

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));

我已经查看过聚合,但我似乎是在圈子里去了:)。

2 个答案:

答案 0 :(得分:2)

卫生署!我想我可以通过使用SelectMany将集合集合压缩成一个集合来回答我自己的问题:

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

答案 1 :(得分:0)

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

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