从LINQ连接中检索单个列

时间:2015-04-28 00:05:57

标签: c# linq

我有一些看起来像这样的数据库表(不能包含原始数据库,所以这样做了:DB Schema

以下是数据的示例:Example

这个想法是一个战士可以成为一个游侠,可以拥有一个名为“火弓”的武器,其法术类型为“弓火”。然后,用户可以随时选择他们想要使用的“Bow Fire”咒语。

此外,魔术师可以成为一名巫师,可以使用具有法术类型“魔杖冰”的“冰冻魔杖”武器。用户可以随时选择他们想要使用的“魔杖冰”拼写。

假设我想知道所选类中所有独特的魔法伤害类型。例如,治疗师和战士使用哪种魔法伤害类型?在T-SQL中,我会这样做:

Select distinct Mag.name from Class C
join SubClass S on C.ID = S.ClassID
join SubClassWeapon W on S.ID = W.SubClassID
join MagicDamageType Mag on W.MagicDamageTypeID = Mag.ID

在上面的例子中,这将给我2个结果(给予战斗机和魔术师):“弓火”和“魔杖冰”。

我正在尝试使用LINQ获得此结果。我能够检索所选的类列表,并尝试了这个:

ClassList.Select(s => s.SubClasses.Select(s => s.SubClassWeapons.Select(s => s.MagicDamageType.Name))).ToList();

我得到了一些时髦的嵌套字符串列表结果。有没有办法在不使用foreach循环的情况下在LINQ中执行此操作?我只是在寻找一个包含来自查询的MagicDamageType名称的字符串列表。

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在寻找SelectMany

ClassList.SelectMany(s => s.SubClasses)
         .SelectMany(s => s.SubClassWeapons)
         .Select(s => s.MagicDamageType.Name).ToList();

这是一个独立于你的例子

void Main()
{
    Blog myBlog = new Blog();

    myBlog.Posts
          .SelectMany(post => post.Comments)
          .Select(comment => comment.Id)
          .ToList()
          .ForEach(Console.WriteLine);
}

public class Blog
{
    public Blog()
    {
        Posts = new List<Post>
        {
            new Post(),
            new Post(),
            new Post(),
        };
    }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public Post()
    {
        Comments = new List<Comment>
        {
            new Comment(),
            new Comment(),
        };
    }
    public List<Comment> Comments { get; set; }
}

public class Comment
{
    public Comment()
    {
        this.Id = Guid.NewGuid().ToString("n");
    }
    public string Id { get; set; }

    public override string ToString()
    {
        return this.Id;
    }
}