Delete duplicates using Lambda

后端 未结 4 1560
南笙
南笙 2021-01-23 01:23

I need some help using a lambda expression to remove duplicate entries in my Entity Framework context. I have a table with the following columns:

Id, DateOfIncide

4条回答
  •  暖寄归人
    2021-01-23 02:20

    var query = db.Incidents
        .Where(x => x.IsAttendanceIncident == "Y")
        .GroupBy(x => new { x.EmployeeId, x.DateOfIncident, x.IsAttendanceIncident })
    

    Example 1:

        .Select(x => x.FirstOrDefault());  // your original code which retrieves entities to not delete
    
    var dupes = db.Incidents.Except( query ); // get entities to delete
    

    Example 2:

        .SelectMany( x => x.OrderBy( y => y.Id ).Skip(1) ); // gets dupes directly
    
    var dupes = query; // already have what we need
    

    And finally:

    foreach( var dupe in dupes )
    {
        db.Incidents.Remove( dupe );
    }
    

    Example SQL generated from a test context I used earlier where Person entity has a 1:N relationship with watches:

    C#:

    context.Persons.SelectMany(x => x.Watches.OrderBy(y => y.Id).Skip(1))
    

    Generated SQL:

    SELECT 
    1 AS [C1], 
    [Skip1].[Id] AS [Id], 
    [Skip1].[Brand] AS [Brand], 
    [Skip1].[Person_Id] AS [Person_Id]
    FROM  [dbo].[Persons] AS [Extent1]
    CROSS APPLY  (SELECT [Project1].[Id] AS [Id], [Project1].[Brand] AS [Brand], [Project1].[Person_Id] AS [Person_Id]
        FROM ( SELECT [Project1].[Id] AS [Id], [Project1].[Brand] AS [Brand], [Project1].[Person_Id] AS [Person_Id], row_number() OVER (ORDER BY [Project1].[Id] ASC) AS [row_number]
            FROM ( SELECT 
                [Extent2].[Id] AS [Id], 
                [Extent2].[Brand] AS [Brand], 
                [Extent2].[Person_Id] AS [Person_Id]
                FROM [dbo].[Watches] AS [Extent2]
                WHERE [Extent1].[Id] = [Extent2].[Person_Id]
            )  AS [Project1]
        )  AS [Project1]
        WHERE [Project1].[row_number] > 1 ) AS [Skip1]
    

提交回复
热议问题