LINQ - 多个嵌套选择

时间:2015-04-23 21:20:03

标签: c# linq

我有以下LINQ查询,它选择了一些导航属性的属性。

var nodes = await dbContext.MonProfiles
    .Include(x => x.Nodes)
    .SelectMany(x =>
        x.Nodes.Select(y =>
            new {y.NodeNativeId, y.NodeClassId, y.NodeName, y.NodeClass.ClassName}))
    .ToListAsync();

我还希望能够选择另一个导航属性的属性,以便它可以单次往返数据库。以下是我尝试过的,但它没有编译:

var nodes = await dbContext.MonProfiles
    .Include(x => x.Nodes)
    .SelectMany(x =>
        new
        {
            x.Nodes.Select(y => 
                new {y.NodeNativeId, y.NodeClassId, y.NodeName, y.NodeClass.ClassName}),
            x.CasAttributes.Select(y => new {y.AttributeName})
        })
    .ToListAsync();

1 个答案:

答案 0 :(得分:1)

您的描述有点不清楚,但我认为您想要的是以下内容:

var nodes = await (from profile in dbContext.MonProfiles.Include(x => x.Nodes)
                   select new {
                       Nodes = from node in profile.Nodes 
                               select new {
                                   node.NodeNativeId,
                                   node.NodeClassId,
                                   node.NodeName,
                                   node.NodeClassName }
                       CasAttributes = from attribute in profile.CasAttributes
                                       select attribute.Name
                   }).ToListAsync();

我不确定这是否适用于您的特定数据库提供程序,但您提供的代码的问题是匿名类型并不知道要用于字段的名称。有时它可以推断它,如果它足够简单(例如,只是访问属性),但是当你调用Select语句或其他东西时,你必须指定字段的名称。