简体   繁体   中英

Checking duplication using LINQ in collection

I have function which inserts record in database. I want to make sure that there are no duplicate entries in database. Function first checks if there is query string parameter. If there is, then it acts like edit mode otherwise insert mode. There is a function which can return currently added records in database. I need to check duplication based on two columns before insertion in database.

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

I want to check duplication based on functiontype and functioncode . Another function mfService.Getmyflows() can return currently added records in database.

How can I check duplication using Linq?

First of all, what database do you use? Many databases support upsert behavior (update or insert depending of was data found or not). For example, MERGE in ms sql , MERGE in oracle , INSERT .. ON DUPLICATE in mysql and so on. This could be preferred solution. Upsert is usually an atomic operation.

In your particular case do you you transactions? Are you sure no one will insert data after you ensured about duplicates but before you have inserted your record? Example:

#1 thread               #2 thread

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

This will end up with duplicates you trying to avoid.

According to your code you populating data from GUI and adding only one item.

If you have access to myService code you could add method to query item by your two columns, instead of querying all items via mfService.Getmyflows() and looking through this collection inside your code. It would be more performant (especially if you have indexes in that columns) and more memory efficient.

And finally, existing of a single element inside collection can be easily done:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM