2013-07-27 58 views
1

我有這兩個類:如何在我的LINQ表達式中包含一個包含表的字段?

public partial class Topic { 
    public int TopicId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<SubTopic> SubTopics { get; set; } 
} 

public partial class SubTopic {  
    public int SubTopicId { get; set; } 
    public string Name { get; set; } 
    public int TopicId { get; set; } 
    public virtual Topic Topic { get; set; 
} 

這是我目前的LINQ聲明:

var subTopics = _subTopicsRepository 
       .GetAll() 
       .Where(s => s.TopicId == topicId) 
       .ToList(); 

我怎樣才能使這樣的副標題變量也有TopicId和Topic.Name,然後有這個填充視圖:

public partial class TopicSubTopic 
{ 
    public int TopicId { get; set; } 
    public int SubTopicId { get; set; } 
    public string TopicName { get; set; } 
    public string SubtopicName { get; set; } 
} 
+0

you mean .Where(s => s.TopicId == topicId && s.TopicName == topicName)? – Ehsan

+0

@Ehsan - 我沒有在SubTopic中的TopicName :-( – Melina

+0

請參閱下面的答案,如果我正確理解你的問題,那就是你要找的內容 – Ehsan

回答

1

您需要連接這兩個表,然後從兩個表中選擇列轉換爲匿名對象。

var topics = new System.Collections.Generic.List<Topic>(); 
var subTopics = new System.Collections.Generic.List<SubTopic>(); 
int topicId = 23984; 
var details = from subtopic in subTopics 
    where subtopic.TopicId == topicId 
    join topic in topics on subtopic.TopicId equals topic.TopicId 
    select new TopicSubTopic() 
    { 
     TopicId = topic.TopicId, 
     SubTopicId = subtopic.SubTopicId, 
     TopicName = topic.Name, 
     SubtopicName = subtopic.Name 
    }; 

http://msdn.microsoft.com/en-us/library/bb311040.aspx

+0

加入將由Entity Framework完成,現在只需查找LINQ語法,謝謝。 – Melina

2

您應該能夠通過虛擬屬性訪問主題。例如,

var subTopics = _subTopicsRepository 
       .GetAll() 
       .Where(s => s.TopicId == topicId && s.Topic.Name == "ExampleTopic") 
       .ToList(); 

編輯:填充視圖模型(其中包含您的模型的組合)我會使用類似AutoMapper。這將允許您指定源模型中的哪些屬性映射到視圖模型上的某些屬性。

在這種情況下創建的映射是這樣的語法的一個例子:

 Mapper.CreateMap<SubTopic, TopicSubTopic>() 
      .ForMember(dest => dest.TopicId, opt => opt.MapFrom(src => src.Topic.TopicId)) 
      .ForMember(dest => dest.SubTopicId, opt => opt.MapFrom(src => src.SubTopicId)) 
      .ForMember(dest => dest.TopicName, opt => opt.MapFrom(src => src.Topic.Name)) 
      .ForMember(dest => dest.SubTopicName, opt => opt.MapFrom(src => src.Name)); 

這使得以擁有它需要在一個水平上,一切是什麼,我想你會的。

+0

謝謝丹,我在我的問題中增加了一個視圖。你的答案是好的,但我怎麼可以讓這進入視圖TopicSubTopic? – Melina

+0

你的答案使用映射器,我不知道這一點呢。這是.Net的標準嗎?我可以做一樣的投影(想想我有合適的詞彙)? – Melina

+0

是的,還有另外一種解決方法可以提供更好的解決方案,但過去我使用過AutoMapper,並發現它對代碼清潔很有用。這是一個免費的開源.Net項目) –

3

這應該這樣做

var subTopics = _subTopicsRepository 
      .GetAll() 
      .Where(s => s.TopicId == topicId && s.Topic.Name == "YourTopic") 
      .Select new{TopicId = s.Topic.TopicId,SubTopicId = s.TopicId,TopicName = s.Topic.Name,SubTopicName = S.Name}; 

然後在你的類只需添加一個構造

public partial class TopicSubTopic { 
    public TopicSubTopic(int topicID,int subTopicId,string topicName,string subTopicName) 
    { 
    TopicId = topicID; 
    SubTopicid = subTopicID; 
    TopicName = topicName; 
    SubTopicName = subTopicName; 
    } 

    public int TopicId { get; set; } 
    public int SubTopicId { get; set; } 
    public string TopicName { get; set; } 
    public string SubtopicName { get; set; } } 

獲得價值和

from item in subTopics.AsEnumerable() 
      select new TopicSubTopic(item.Topicid,item.SubTopicid,item.TopicName,item.SubTopicName); 
相關問題