我在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"
我想从我的所有记录中收集所有标签。所以:“一,二,三,四,五,六,七”
我该怎么办?这似乎是一个愚蠢的问题,但我不知道如何继续。
感谢。
答案 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();