2015-10-05 57 views
0

扁平化集合我有以下实体(国际化是一个本地化的实体):如何使用的SelectMany

public class Post { 
    public Int32 Id { get; set; } 
    public Boolean IsPublished { get; set; } 
    public List<PostI18N> PostsI18N { get; set; } 
    public List<Tag> Tags { get; set; } 
    public Author { get; set; } 
} 

public class Tag { 
    public List<TagI18N> TagsI18N { get; set; } 
} 

public class Author { 
    public Int32 Id { get; set; } 
    public String Name { get; set; } 
} 

public class PostI18N { 
    public Int32 Id { get; set; } 
    public String Text { get; set; } 
    public String Title { get; set; } 
} 

public class TagI18N { 
    public Int32 Id { get; set; } 
    public String Name { get; set; } 
} 

我需要得到的4个员额的所有信息,所以我试图拉平查询:

var posts = await _context 
    .Posts 
    .SelectMany(x => x.PostsI18N, (Post, PostI18N) => 
     new { Post, PostI18N, Post.Tags, Post.Author }) 
    .Where(x => x.PostI18N.Language == "en") 
    .Select(x => new PostDTO { 
     Id = x.Post.Id, 
     Title = x.PostI18N.Title, 
     Text = x.PostI18N.Text, 
     AuthorName = x.Author.Name 
     TagsNames = // Names taken from x.Tags.TagsI18N where TagsI18N 
        // language is "en" ... So, for each tag look the 
        // one Tag.TagI18N which Tag.TagI18N.Language = "en" 
        // and get Tag.TagI18N.Name 
    }) 
    .Take(4) 
    .ToListAsync(); 

问题: 的问题是,我还需要TagsI18N压扁,所以我可以把他们的名字对于英语...

SelectMany有可能吗?我应该怎么做?

+1

我不是对你输出清晰正在努力实现。你可以编辑这个问题,并提供一个你想要输出结果的例子吗? –

+0

我只是在PostDTO创建中添加了更多信息。我有问题的列是TagsNames –

+0

@Miguel发布您需要的输出。在你的模型中没有'语言'列和预期的输出。 – Jones

回答

1

在查询语法尝试它,而不是:

var posts = await (
    from p in _context.Posts 
    from pn in p.PostsI18N 
    where pn.Language == "en" 
    select new PostDTO { 
     Id = p.Id, 
     Title = pn.Title, 
     Text = pn.Text, 
     AuthorName = p.Author.Name, 
     TagsNames = from t in p.Tags 
        from tn in t.TagsI18N 
        where tn.Language == "en" 
        select tn.Name 
    }).Take(4).ToListAsync(); 

的语法的SelectMany应该工作一样好,但它变得有点“嵌套”:

var posts = await _context 
    .Posts 
    .SelectMany(x => x.PostsI18N, (Post, PostI18N) => 
     new { Post, PostI18N, Post.Tags, Post.Author }) 
    .Where(x => x.PostI18N.Language == "en") 
    .Select(x => new PostDTO { 
     Id = x.Post.Id, 
     Title = x.PostI18N.Title, 
     Text = x.PostI18N.Text, 
     AuthorName = x.Author.Name 
     TagsNames = 
      x.Tags.SelectMany(t => t.TagsI18N, (Tag, TagI18N) => 
       new { Tag, TagI18N }) 
      .Where(t => t.TagI18N.Language == "en") 
      .Select(t => t.TagI18N.Name) 
    }) 
    .Take(4) 
    .ToListAsync(); 
+0

是的,这是一个解决方案......但是是否有可能将SelectMany中的标签变平? –

+0

也应该工作,我更新了我的答案。 –

+0

但是不可能在官方的selectmany中包含tagsI18n ......只是想知道 –