C# 如何改进检查数据库中是否已存在当前项的方法

C# 如何改进检查数据库中是否已存在当前项的方法,c#,methods,repository,C#,Methods,Repository,我有一个方法,在将当前项添加到数据库之前检查它是否存在于数据库中,如果它确实存在,则删除该项,否则将添加它 有没有更好的办法? 因为现在的标题必须完全相同。如果标题有字符/单词差异,则不会将其删除 基本上我的意思是: 如果标题是“罗纳尔多失去了右腿”,并且数据库中有一个标题是“罗纳尔多昨天失去了右腿”,则应删除当前项目 另一个例子: 如果标题为“hello world”,并且数据库中有一个标题为“hello world everyone”,则应删除当前项目 因此,基本上,如果文本中有常用词,它应

我有一个方法,在将当前项添加到数据库之前检查它是否存在于数据库中,如果它确实存在,则删除该项,否则将添加它

有没有更好的办法? 因为现在的标题必须完全相同。如果标题有字符/单词差异,则不会将其删除

基本上我的意思是:

如果标题是“罗纳尔多失去了右腿”,并且数据库中有一个标题是“罗纳尔多昨天失去了右腿”,则应删除当前项目

另一个例子:

如果标题为“hello world”,并且数据库中有一个标题为“hello world everyone”,则应删除当前项目

因此,基本上,如果文本中有常用词,它应该删除该项

以下是我到目前为止采用的方法:

public void AddNews(News news)
    {
        var exists = db.News.Any(x => x.Title == news.Title);

         if (exists == false)
        {
            db.News.AddObject(news);
        }
        else
        {
            db.News.DeleteObject(news);
        }
    }
感谢您的任何帮助

如果标题只是有一个小字符差异,它不会删除它

在两端使用ToUpper()将确保有效检查,即使套管不同

var exists = db.News.Any(x => x.Title.ToUpper() == news.Title.ToUpper());
如果您想用其他方法检查对象是否存在,我们需要更多信息

更新

在你的评论中,你可以去掉所有非字母数字字符

Regex rgx = new Regex("[^a-zA-Z0-9 -]");
var exists = db.News.Any(x => rgx.Replace(x.Title.ToUpper(), "") == rgx.Replace(news.Title.ToUpper(), ""));
“Hello world”将与“Hello world!”

如果标题只是有一个小字符差异,它不会删除它

在两端使用ToUpper()将确保有效检查,即使套管不同

var exists = db.News.Any(x => x.Title.ToUpper() == news.Title.ToUpper());
如果您想用其他方法检查对象是否存在,我们需要更多信息

更新

在你的评论中,你可以去掉所有非字母数字字符

Regex rgx = new Regex("[^a-zA-Z0-9 -]");
var exists = db.News.Any(x => rgx.Replace(x.Title.ToUpper(), "") == rgx.Replace(news.Title.ToUpper(), ""));
“Hello world”将匹配“Hello world!”

我不知道C,但BASIC有instr$,javascript有indexOf()。。。C#可能有类似的东西,它会检查你的字符串是否存在于另一个字符串中——这意味着如果你搜索“hello”,它将显示为“hello”或“hello world”或“world hello”的匹配项,但“hello world”不会找到“world hello”。。。因为我不知道C#这不是有效的代码,但应该会让你走上正确的轨道

var dbTitle = wherever you get the existing titles from
var yourSearchTerm = what you want to find

if (dbTitle.indexOf(yourSearchTerm)>0) { //indexOf() returns -1 if match not found
db.News.AddObject(news);
}
else {
db.News.DeleteObject(news);
}
在帮助文件中搜索字符串操作以找到正确的命令。

我不知道C#,但BASIC有instr$,javascript有indexOf()。。。C#可能有类似的东西,它会检查你的字符串是否存在于另一个字符串中——这意味着如果你搜索“hello”,它将显示为“hello”或“hello world”或“world hello”的匹配项,但“hello world”不会找到“world hello”。。。因为我不知道C#这不是有效的代码,但应该会让你走上正确的轨道

var dbTitle = wherever you get the existing titles from
var yourSearchTerm = what you want to find

if (dbTitle.indexOf(yourSearchTerm)>0) { //indexOf() returns -1 if match not found
db.News.AddObject(news);
}
else {
db.News.DeleteObject(news);
}

在帮助文件中搜索字符串操作以找到正确的命令。

您的问题提出的问题比提供清晰答案所需的问题多。请问您为什么要在名为AddItem的方法中删除项?您的意思是,当项目的标识符与作为参数提供的标识符匹配时,您不想更新项目吗

话虽如此,实现所需行为基本上有两种选择:在代码中执行匹配,或在数据库中执行匹配。然而,这两种方法都要求你们两人准确地定义两人匹配的含义。其他答案已经暗示了这一点

在代码中执行匹配的优点是灵活性:在C#中编写这种(复杂的)逻辑通常比在SQL中编写更容易。另外,由于可以使用EF,您将免费获得持久性代码(我假设您正在查看代码示例)


在SQL中执行此操作的优点是性能更高,因为在做出插入/更新/删除决策之前,不必从数据库中检索整个实体。您可以通过在entity表上添加INSERT而不是INSERT触发器来实现这一点,并在发现提供的实体与现有实体实际匹配时执行更新/删除

你的问题提出的问题比提供明确答案的问题多。请问您为什么要在名为AddItem的方法中删除项?您的意思是,当项目的标识符与作为参数提供的标识符匹配时,您不想更新项目吗

话虽如此,实现所需行为基本上有两种选择:在代码中执行匹配,或在数据库中执行匹配。然而,这两种方法都要求你们两人准确地定义两人匹配的含义。其他答案已经暗示了这一点

在代码中执行匹配的优点是灵活性:在C#中编写这种(复杂的)逻辑通常比在SQL中编写更容易。另外,由于可以使用EF,您将免费获得持久性代码(我假设您正在查看代码示例)


在SQL中执行此操作的优点是性能更高,因为在做出插入/更新/删除决策之前,不必从数据库中检索整个实体。您可以通过在entity表上添加INSERT而不是INSERT触发器来实现这一点,并在发现提供的实体与现有实体实际匹配时执行更新/删除

首先,我同意@Jonesy的观点,可以使用

string[] list1 = myStr.Split(null);
null强制在空格上拆分。见:

这些单词可以放在列表中。列表的交集会立即告诉您哪些单词完全匹配,以及有多少单词完全匹配。任何其他单词都是不匹配的单词

var result = list1.Intersect(list2, StringComparer.InvariantCultureIgnoreCase);
因此,对于不匹配的单词,可以使用Levenshtein距离对每个单词进行比较,得到分数。我在下面包含了代码,但尚未测试这是否是一个正常工作的实现。不管怎样,使用它的原因是,你可以通过对每个单词进行多少次运算来进行比较