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);
}