0

我在我的 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"

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

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

谢谢。

4

3 回答 3

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();
于 2012-09-01T18:05:47.993 回答
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.

于 2012-09-01T14:38:17.760 回答
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();
于 2012-09-01T18:16:03.160 回答