从我的不同记录中获取所有标签

时间:2012-09-01 14:33:18

标签: linq entity-framework

我在ASP.NET MVC项目中使用EntityFramework。

假设我有以下实体:

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

假设我的数据库中有以下数据:

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"

我想从我的所有记录中收集所有标签。所以:“一,二,三,四,五,六,七”

我该怎么办?这似乎是一个愚蠢的问题,但我不知道如何继续。

感谢。

3 个答案:

答案 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

答案 1 :(得分:0)

分割字符串后,您可以使用SelectMany()连接集合,然后使用Distinct()删除重复项。

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

这是查询语法版本,在幕后转换为SelectMany()语句:

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

答案 2 :(得分:0)

不幸的是,Split()不会转换为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();