【问题标题】:select named field in ef core select statement which uses generics在使用泛型的 ef 核心选择语句中选择命名字段
【发布时间】:2021-04-28 18:06:00
【问题描述】:

我有下面的方法可以将新记录插入我的数据库

public static async Task SaveDataToEntitySetAsync<TEntity>(DbContext context,List<TEntity> list) 
    where TEntity : class
{
    if(list.Any() == false)
        return;
    
     var dbSet = context.Set<TEntity>();
     var existingData = await dbSet.Select(x=>x.Id).ToListAsync();
     list.RemoveAll(x => existingData.Contains(x.Id));
     await dbSet.AddRangeAsync(list);
}

如果我不使用泛型,上面的逻辑就是我想要做的事情

如何将其转换为适用于泛型的语法?此语法在通用上下文中不起作用,因为 .Id 无效

我使用的是 EF Core,因此当向表中添加记录时,EF Core 会自动将记录添加到关联的外键表中

这种方法的问题是我在我的上下文中为每个表调用了这个方法。

假设添加了一位英国客户。这很好,添加了客户,并添加了 Country UK(假设它还没有)

我还有一个我保存到数据库中的所有国家的摘录。显然现在这将打破,因为英国已经被拯救了

因此,我试图从我的国家/地区列表中删除已在数据库中的所有项目

我所有的实体都来自 BaseEntity(这是定义 Id 的地方),但我不知道如何利用这个事实

保罗

【问题讨论】:

    标签: c# linq generics linq-to-sql entity-framework-core


    【解决方案1】:

    由于您的实体已经从具有 Id 属性的同一基类继承,您可以将您的泛型类型限制为:

    where TEntity : BaseEntity
    

    【讨论】:

      【解决方案2】:

      您可以传递Expression&lt;Func&lt;TEntity, TKey&gt;&gt; keyExtractor lambda 表达式,例如x =&gt; x.Id

      public static async Task SaveDataToEntitySetAsync<TEntity, TKey>(DbContext context, List<TEntity> list, Expression<Func<TEntity, TKey>> keyExtractor)
          where TEntity : class
      {
          if (list.Any() == false)
              return;
      
          var dbSet = context.Set<TEntity>();
          var existingData = await dbSet.Select(keyExtractor).ToListAsync();
      
          Func<TEntity, TKey> keyExtractorCompiled = keyExtractor.Compile();
          list.RemoveAll(x => existingData.Contains(keyExtractorCompiled(x)));
      
          await dbSet.AddRangeAsync(list);
      }
      

      然后:

      await SaveDataToEntitySetAsync(..., x => x.Id);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-19
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 2021-08-27
        相关资源
        最近更新 更多