2015-10-06 87 views
1

我有以下實體(國際化是一個本地化的實體):找孩子的子記錄查詢

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

public class Category { 
    public Int32 Id { get; set; } 
    public List<CategoryI18N> CategoriesI18N { get; set; } 
} 

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

public class CategoryI18N { 
    public Int32 Id { get; set; } 
    public String LanguageCode { get; set; } 
    public String Name { get; set; } 
    public String Slug { get; set; }  
} 

我需要得到其類別職位的所有本地化的列表,所以我有:

var posts = await _context 
    .Posts 
    .SelectMany(x => x.PostsI18N, 
    (Post, PostI18N) => new { Post, PostI18N, Post.Category }) 
    .Where(x => x.PostI18N.LanguageCode == "en") 
    .Select(x => new PostDTO { 
     Id = x.Post.Id, 
     Title = x.PostI18N.Title, 
     Text = x.PostI18N.Text, 
     CategoryDto = new CategoryDto { 
     Id = x.Category.Id, 
     Name = // ?? 
     Slug = // ?? 
     // The name and slug should be taken from 
     // x.Post.Category.CategoriesI18N which has LanguageCode = "en" 
     }   
    }); 

我的問題是如何獲取類別本地化信息(請參閱查詢中的評論)。

有誰知道如何做到這一點?

+0

正如我在模型中看到的那樣,Category和CategoryI18N實體之間存在一對多的關係!因此,您必須爲該方法編寫子查詢或其他查詢。 –

回答

0

這聽起來像你想

Name = x.Post.Category.CategoriesI18N.Any(c => c.LanguageCode == "en") 
     ? x.Post.Category.CategoriesI18N.First(c => c.LanguageCode == "en").Name 
     : string.Empty // or whatever default you want when a match is not found 

或者,它可能會更有意義做

CategoryDto = x.Post.Category.CategoriesI18N 
       .Where(c => c.LanguageCode == "en") 
       .Select(c => new CategoryDto { 
        Id = x.Category.Id, 
        Name = c.Name, 
        Slug = c.Slug 
       }).FirstOrDefault()  

如果所有的值應該來自同一CategoryI18N

如果你還想要一個CategoryDto如果沒有匹配,您可以在FirstOrDefault()之後添加?? new CategoryDto { ... }