C# 在带有子字符串的SQL Server表上使用LINQ,在ASP.NET中进行循环搜索
我有一个名为C# 在带有子字符串的SQL Server表上使用LINQ,在ASP.NET中进行循环搜索,c#,asp.net,sql,linq,C#,Asp.net,Sql,Linq,我有一个名为knowledged(KB)的表,其中包含ID、Link和Title列 我需要搜索该表,根据用户在表单中键入的标记,在Title列中查找包含匹配项的行 我正在尝试为此功能使用子字符串。用户键入的标记是逗号分隔的(与kb标题不同),但我使用String.Replace方法将逗号替换为空格 我可以将表存储在内存中,然后搜索记录吗?这张桌子不大 到目前为止,我有以下代码: int ValidSuggestions = 0; string IndidentTagsFromFormWithou
knowledged
(KB)的表,其中包含ID
、Link
和Title
列
我需要搜索该表,根据用户在表单中键入的标记,在Title
列中查找包含匹配项的行
我正在尝试为此功能使用子字符串。用户键入的标记是逗号分隔的(与kb标题不同),但我使用String.Replace
方法将逗号替换为空格
我可以将表存储在内存中,然后搜索记录吗?这张桌子不大
到目前为止,我有以下代码:
int ValidSuggestions = 0;
string IndidentTagsFromFormWithoutCommas = incident.Tags.Replace(",", " ");
for (int i = 0; i < IndidentTagsFromFormWithoutCommas.Length; i++)
{
for (int j = 0; j < db.Knowledgebases.Count(); j++)
{
//How to search the KB title field with the IndidentTagsFromFormWithoutCommas;
//Save the results into a KBViewModel
//ValidSuggestions++;
}
}
if (ValidSuggestions > 2)
{
//Take to view with the articles
}
else
{
return RedirectToAction("AllIncidentsForThisCustomer", "Log");
}
编辑:
我似乎无法得出任何结果。以下是我的事件控制器代码:
public ActionResult Create(Incident incident)
{
KnowledgeService KS = new KnowledgeService(db);
if (ModelState.IsValid)
{
incident.Log.Id = User.Identity.GetUserId().ToString();
incident.Log.DateTimeLogged = System.DateTime.Now;
incident.LogID = db.Logs.Max(item => item.LogID);
incident.EstimatedResolveDate = incident.CalculateEstimatedResolveDate();
db.Incidents.Add(incident);
db.SaveChanges();
if (KS.GetSuggestionsByTags(incident.Tags.Split(',').Select(t => t.Trim()).ToList()).Count() > 1)
{
KnowledgebaseSuggestions(incident.Tags);
}
else
{
return RedirectToAction("AllIncidentsForThisCustomer", "Log");
}
}
return View(incident);
}
知识库建议是:
public ActionResult KnowledgebaseSuggestions(String IncidentTags)
{
KnowledgeService KS = new KnowledgeService(db);
ViewBag.KSResults = KS.GetSuggestionsByTags(IncidentTags.Split(',').Select(t => t.Trim()).ToList());
return View();
}
我是否正确使用了您的建议?如果我正确理解了您的意思,您可以尝试以下方法:
var tags = incident.Tags.Split(',').Select(t => t.Trim()).ToList();
var validSuggestions = db.Knowledgebases.Where(k => tags.Contains(k.Title))
.Select(k => new KnowledgebaseViewModel()
{
ID = k.ID,
Title = k.Title,
Link = k.Link
})
.ToList();
//here goes if (validSuggestions > 2) ...
更新:
如果您希望只匹配标记的开头,请使用:
db.Knowledgebases.Where(k => tags.StartsWith(t))
如果您期望来自用户的标记可能只是db中标记的子字符串,则可以使用以下查询:
db.Knowledgebases.Where(k => tags.Any(t => k.Title.Contains(t)))
投影部分(.Select()方法)应相同
更新2:
如果需要在其他操作中重用这样的查询,请考虑使用存储库模式进行查询,或者仅在某些知识服务类中包装该逻辑:
public class KnowledgeService
{
private readonly YourDbContext db;
public KnowledgeService(YourDbContext db)
{
this.db = db;
}
public IEnumerable<KnowledgebaseViewModel> GetSuggestionsByTags(IEnumerable<string> tags)
{
//Here goes logic for getting suggestions
}
}
然后在你的行动中:
public ActionResult KnowledgebaseSuggestions(String IncidentTags)
{
KnowledgeService KS = new KnowledgeService(db);
var viewModel = KS.GetSuggestionsByTags(IncidentTags);
return View(viewModel);
}
在其他行动中:
var suggestedTags = KS.GetSuggestionsByTags(incident.Tags);
if (suggestedTags.Count() > 1)
{
return View("KnowledgebaseSuggestions", suggestedTags);
}
不要在另一个操作中调用某个操作,因为稍后更改KnowledgebaseSuggestions操作会破坏创建操作。我明白了。在ViewModel中存储的有效方法是什么?类似这样的内容…ToList()选择new KnowledgebaseViewModel{ID=kb.KnowledgebaseID,Title=kb.KnowledgebaseTitle,Link=kb.KnowledgebaseLink};对不起,我真的不明白你在问我什么。在您的问题中,您说过该表包含字段ID、标题和链接。然后在其底部指定ViewModel类。我使用.Select()扩展方法进行了投影,我认为这是一种有效的方式。是的,很抱歉,我在重新加载oopsAlso之前没有看到编辑。因此,我想在与用户输入表单不同的另一个页面上显示KnowlegdeBaseViewModel。我有一个设置,但如何将viewmodel传递给同一控制器中的另一个方法(可能返回视图)?错误。我在select下得到一条红线,表示bool不包含select的定义
public ActionResult KnowledgebaseSuggestions(String IncidentTags)
{
KnowledgeService KS = new KnowledgeService(db);
var viewModel = KS.GetSuggestionsByTags(IncidentTags);
return View(viewModel);
}
var suggestedTags = KS.GetSuggestionsByTags(incident.Tags);
if (suggestedTags.Count() > 1)
{
return View("KnowledgebaseSuggestions", suggestedTags);
}