【问题标题】:Checking duplication using LINQ in collection在集合中使用 LINQ 检查重复
【发布时间】:2016-07-20 09:17:26
【问题描述】:

我有在数据库中插入记录的功能。我想确保数据库中没有重复的条目。函数首先检查是否有查询字符串参数。如果有,那么它就像编辑模式,否则就像插入模式。有一个函数可以返回数据库中当前添加的记录。在插入数据库之前,我需要根据两列检查重复。

    myService = new myService();
    myFlow mf = new myFlow();
    if (!string.IsNullOrEmpty(Request["myflowid"]))
    {
        mf = myService.Getmyflow(Convert.ToInt32(Request["myflowid"]));
    }
    int workcount = 0;
    int.TryParse(txtWorkCount.Text, out workcount);
    mf.Name = txtName.Text.Trim();
    mf.Description = txtDescription.Text.Trim();
    mf.FunctionCode = txtFunctioneCode.Text.Trim();
    mf.FunctionType = txtFunctioneType.Text.Trim();
    mf.WorkCount = workcount;

    if (mf.WorkFlowId == 0)
    {
        mf.SortOrder = 0;
        mf.Active = true;
        mf.RecordDateTime = DateTime.Now;
        message = "Saved Successfully";
    }
    else
    {
        _editMode = true;
        message = "Update Successfully";
    }
}

int myflowId = mfService.AddEditmyflow(mf);

我想检查基于functiontype 和functioncode 的重复。另一个函数mfService.Getmyflows()可以返回数据库中当前添加的记录。

如何使用 Linq 检查重复?

【问题讨论】:

  • 我建议使用Entity framework(因为它更容易理解和数百个教程)来处理其中的数据库和数据。另外,我想说你可以在你的数据库中使用复合键,这会抛出 DuplicateKeyException,并且可能会被捕获。

标签: c# linq


【解决方案1】:

首先,您使用什么数据库?许多数据库支持 upsert 行为(更新或插入取决于是否找到数据)。例如,MERGE in ms sql、MERGE in oracle、INSERT .. ON DUPLICATE in mysql 等。这可能是首选的解决方案。 Upsert 通常是一个原子操作。

在您的特定情况下,您进行交易吗?您确定没有人会在您确保重复之后但在您插入记录之前插入数据吗?示例:

#1 thread               #2 thread

look for duplicates
...                     look for duplicate
no duplicates found     ...
                        no duplicates found
insert data_1
                        insert data_1

这将导致您试图避免重复。

根据您的代码,您从 GUI 填充数据并仅添加一项。

如果您有权访问myService 代码,则可以添加方法以按两列查询项目,而不是通过mfService.Getmyflows() 查询所有项目并在代码中查看此集合。它会更高效(特别是如果您在该列中有索引)并且内存效率更高。

最后,可以轻松地在集合中存在单个元素:

var alreadyExist = mfService.Getmyflows()
                            .Any(x => x.Column1 == value1 && x.Column2 == value2);

【讨论】:

  • @MachineLearning 在执行此代码时,不清楚数据上下文是否存在。例如,它可以在Getmyflows 方法中创建和发布。更重要的是,没有任何声明可以通过 linq-to-sql、实体框架或任何其他形式访问数据库。也可能存在具有Chaos 隔离级别的TransactionScope。我不知道发布的代码之外发生了什么。
猜你喜欢
  • 2010-11-14
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多