2015-10-05 66 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 ......只是想知道 –