我有一些看起来像这样的数据库表(不能包含原始数据库,所以这样做了: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名称的字符串列表。
谢谢!
答案 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;
}
}