2012-09-01 123 views
0

我在ASP.NET MVC項目上使用EntityFramework。從我的不同記錄中獲取所有標記

比方說,我有以下實體:

public class Project 
{ 
    public int ProjectID { get; set; } 
    public string Description { get; set; } 
    public string Tags { get; set; } 
} 

可以說,我有我的DB以下數據:

ProjectID: 1 
Description: "My first element" 
Tags: "one, three, five, seven" 

ProjectID: 2 
Description: "My second element" 
Tags: "one, two, three, six" 

ProjectID: 3 
Description: "My third element" 
Tags: "two, three, four" 

我想從我的所有記錄,收集所有的標籤。所以:「一,二,三,四,五,六,七」

我該怎麼辦?這可能似乎是一個愚蠢的問題,但我不知道如何繼續。

謝謝。

+0

命令不重要嗎?例如,「一,三,五,七,二,六,四」會好嗎? –

回答

0

您需要使用string.Split()來挖掘列表中的每個標籤。

HashSet<string> allTags = new HashSet<string>(); 
foreach(Project project in context.Projects) 
{ 
    string tagsList = project.Tags; 
    string[] separateTags = tagsList.Split(", ", StringSplitOptions.RemoveEmptyEntries); 
    foreach(string separateTag in separateTags) 
    { 
     allTags.Add(separateTag); 
    } 
} 

然後allTags將包含您的所有標籤。如果您想再次將它們放入一個大字符串中,請使用string.Join

+0

非常感謝。它工作得很好。 – Bronzato

0

分割字符串後,可以使用SelectMany()連接集合,然後使用Distinct()刪除重複項。

var tags = context.Projects 
       .SelectMany(p => p.Tags.Split(", ", StringSplitOptions.RemoveEmptyEntries)) 
       .Distinct(); 

下面是查詢語法的版本,它獲取transated到SelectMany()聲明幕後:

var tags = (from p in project 
      from tag in p.Tags.Split(", ", StringSplitOptions.RemoveEmptyEntries) 
      select tag).Distinct(); 
0

不幸的是,斯普利特()將不會轉換爲SQL,所以你必須要做到這一點在記憶中。我建議如下:

var tags = context.Projects 
    // pull only the tags string into memory 
    .Select(p => p.Tags) 
    // operate in memory from this point on 
    .AsEnumerable() 
    // remove empty entries so you don't get "" interpreted as one empty tag 
    .SelectMany(tags => tags.Split(",", StringSplitOptions.RemoveEmptyEntries)) 
    // assuming you don't want leading or trailing whitespace 
    .Select(tag => tag.Trim()) 
    .ToList(); 
相關問題