EF去除重复列DistinctBy

本文介绍了一个C#中的自定义扩展方法DistinctBy,用于实现集合中元素的去重,不仅支持单一属性,还支持复合属性的去重操作。通过实例展示了如何在查询表达式中使用此方法。

1.添加一个扩展方法

 public static class DistinctByClass
    {
        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
        {
            HashSet<TKey> seenKeys = new HashSet<TKey>();
            foreach (TSource element in source)
            {
                if (seenKeys.Add(keySelector(element)))
                {
                    yield return element;
                }
            }
        }
	}

2.使用方法如下(针对ID,和Name进行Distinct)

var query = people.DistinctBy(p => new { p.Id, p.Name });

3.若仅仅针对ID进行distinct

var query = people.DistinctBy(p => p.Id);

例如:

var q = (from f in db.FW_Cultivate
                     join p in db.Sys_Product on f.ProdID equals p.ProdID
                     select new
                     {
                         f.ProdID,
                         f.EntID,
                         f.DisID,
                         p.ProdName
                     })
                .WhereIf(filter.EntID > 0, t => t.EntID == filter.EntID)
                .WhereIf(filter.DisID > 0, t => t.DisID == filter.DisID).DistinctBy(t=>t.ProdName);
<think>嗯,用户问的是在.NET Core ABP框架中使用EF获取计算的问题。首先,我需要回忆一下ABP框架的结构以及Entity Framework Core如何处理计算。计算通常是在数据库层面生成的,比如通过SQL表达式或者存储生成的,而不是在应用程序中计算出来的。在EF Core中,可以使用HasComputedColumnSql方法来配置计算。 接下来,用户可能是在使用ABP的领域层,特别是实体和DbContext配置。ABP框架封装了EF Core的一些配置,可能需要用户在实体映射类中进行配置,比如在DbContext的OnModelCreating方法里或者使用IEntityTypeConfiguration接口。 然后,我需要考虑计算的两种类型:存储和非存储。存储计算会在数据库中持久化,每次更新相关时会重新计算;而非存储的则是每次查询时计算。用户可能需要根据场景选择合适的类型。 另外,ABP框架可能有自己的约定或扩展方法,需要确保配置方法与ABP的结构兼容。例如,在模块类中配置自定义的DbContext,或者在实体类中使用特性(虽然EF Core更推荐Fluent API)。 可能用户遇到的困难是如何在ABP的领域层正确配置计算,或者如何在查询时包含计算的值。需要指导用户正确地在EntityTypeConfiguration中使用Fluent API配置计算,并确保迁移后数据库生成了正确的。 另外,需要注意EF Core中计算的值通常不能由应用程序插入或更新,因此需要在实体模型中设置为忽略,使用Property(...).ValueGeneratedOnAddOrUpdate()等方法。 可能还需要提醒用户运行Add-Migration和Update-Database命令来应用更改,并检查数据库架构是否正确生成。 总结一下,步骤应该是:在实体配置中使用HasComputedColumnSql配置计算,运行迁移,查询时EF会自动包含该。同时,注意计算是否为存储的,以及ABP框架是否有特殊要求。</think>在.NET Core中使用ABP框架和Entity Framework Core(EF Core)获取计算(Computed Column)时,可以通过以下步骤实现: --- ### **1. 理解计算** 计算是数据库中的一个,其值通过SQL表达式(如其他的运算、函数等)生成,而不是手动插入。例如: ```sql -- SQL Server示例:FullName = FirstName + ' ' + LastName ALTER TABLE Users ADD FullName AS (FirstName + ' ' + LastName); ``` --- ### **2. 在EF Core中配置计算** 在ABP的DbContext或实体映射配置中,使用Fluent API配置计算: #### **步骤 1:定义实体** ```csharp public class User : AggregateRoot<Guid> { public string FirstName { get; set; } public string LastName { get; set; } // 计算(不需要Setter) public string FullName { get; private set; } } ``` #### **步骤 2:在DbContext中配置计算** 在ABP的`DbContext`类中,重写`OnModelCreating`方法,或在单独的`EntityTypeConfiguration`中配置: ```csharp public class MyDbContext : AbpDbContext<MyDbContext> { protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<User>(entity => { // 配置计算 entity.Property(p => p.FullName) .HasComputedColumnSql("FirstName + ' ' + LastName"); // SQL表达式 //.HasComputedColumnSql("FirstName || ' ' || LastName"); // SQLite语法 //.HasComputedColumnSql("CONCAT(FirstName, ' ', LastName)"); // MySQL语法 }); } } ``` --- ### **3. 迁移与数据库更新** 生成并应用迁移: ```bash dotnet ef migrations add Added_User_FullName_ComputedColumn dotnet ef database update ``` --- ### **4. 查询计算** 计算的值由数据库自动生成,查询时可直接读取: ```csharp var users = await _userRepository.GetListAsync(); foreach (var user in users) { Console.WriteLine(user.FullName); // 直接访问计算 } ``` --- ### **注意事项** 1. **数据库兼容性** 不同数据库(SQL Server/MySQL/PostgreSQL等)的SQL语法可能不同,需根据数据库类型调整表达式。 2. **存储计算 vs 非存储计算** - **存储(Persisted)**:值在插入/更新时计算并持久化到磁盘。 - **非存储(Virtual)**:值在查询时实时计算(默认行为)。 ```csharp // SQL Server示例:存储计算 .HasComputedColumnSql("FirstName + ' ' + LastName PERSISTED"); ``` 3. **ABP扩展方法** ABP可能会扩展EF Core的配置方法,但核心逻辑与原生EF Core一致。 4. **只读属性** 计算的值由数据库生成,实体类中应避免手动设置。 --- ### **5. 高级场景:动态计算** 如果需要在代码中动态计算(而非数据库层面),可使用EF Core的`ValueConverter`或查询时投影: ```csharp var users = await _dbContext.Users .Select(u => new { u.Id, FullName = u.FirstName + " " + u.LastName // 内存中计算 }) .ToListAsync(); ``` --- 通过以上步骤,你可以在ABP框架中结合EF Core高效使用计算。如果有其他具体需求(如跨数据库支持),请进一步说明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值